딥러닝

0812 텐서플로 기초

피곤핑 2019. 8. 12. 16:19

p.34~

 

tensorflow : 텐서를 흘려보내면서 데이터를 처리하는 라이브러리

텐서들은 계산 그래프구조를 통해 노드에서 노드로 이동

 

> 텐서플로 그래프 생성

 - shape() 이라는 것은 스칼라 값을 의미함.

 - 사용할것이라고 선언만 한 것. 실행은 따로함! (-> 세션을 열어서 수행해야함)

## 그래프 노드를 정의하고 출력
node1 = tf.constant(3.0, dtype=tf.float32) ## 상수값을 표현
node2 = tf.constant(4.0) # 암시적으로 tf.float32 타입으로 선언될것
print(node1, node2)

> 텐서플로 그래프 실행

## 세션을 열고 그래프를 실행합니다.
# 출력값 : [3.0, 4.0]
sess = tf.Session()
print(sess.run([node1, node2]))

 

> 더 복잡한 그래프 구조 생성(더복잡한 연산을 수행)

 - node3은 +(연산자)라고 볼 수 있음.

 

> 모든 코드를 실행 후 세션 종료.

sess.close()

 

==> 상수값을 사용하였기 때문에 다른값으로 바꾸어 계산할 수 없음

 

 플레이스 홀더 

 - 임의의 값을 입력받아서 임의의 값을 출력하기 위한 텐서플로 API .

(만약 위에서 세션을 닫았다면 sess = tf.Session() 으로 세션을 다시 열어주어야 함!)

 - feed_dict : 정해진 argument 이름. -> 항상 우리가 지정해주어야함

## 플레이스 홀더 노드와 add 노드를 정의합니다.
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a+b # 암시적으로 tf.add(a,b) 형태로 정의될 것.

 - 노드를 추가한 더 복잡한 그래프 형태

## 노드를 추가해서 더 복잡한 그래프 형태를 만들기
# 출력값 : 22.5
add_and_triple = adder_node * 3
tf.multiply(adder_node, 3)
print(sess.run(add_and_triple, feed_dict={a:3, b:4.5}))

 

머신러닝의 프로세스

.

선형회귀

 - tf.Variable : 변수만들기

 - 

## 선형회귀 p.52
import tensorflow as tf
# 선형회귀모델 (Wx+b)을 정의합니다.
W = tf.Variable(tf.random_normal(shape=[1]))
b = tf.Variable(tf.random_normal(shape=[1]))
x = tf.placeholder(tf.float32)
linear_model = W*x + b

## True Value를 입력받기 위한 플레이스 홀더를 정의
y = tf.placeholder(tf.float32)

## 손실 함수 정의
loss = tf.reduce_mean(tf.square(linear_model - y)) ## MSE 손실함수

## 최적화를 위한 그라디언트 디센트 옵티마이저를 정의
optimizer = tf.train.GradientDescentOptimizer(0.01)
train_step = optimizer.minimize(loss) ## 최소의 손실로 만들어주려고

## 트레이닝을 위한 입력값과 출력값을 준비
x_train = [1,2,3,4]
y_train = [2,4,6,8]

## 세션을 실행하고 파라미터(W,b)를 normal distribution에서 추출한 임의의 값으로 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())

## 경사하강법을 1000번 수행
for i in range(1000) :
    sess.run(train_step, feed_dict={x:x_train, y:y_train})
    
## 테스트를 위한 입력값을 준비
x_test = [3.5, 5, 5.5, 6]

## 테스트 데이터를 이용해 학습된 선형회귀 모델이 데이터의 경향성을 잘 학습했는지 측정
## (y=2x)
## 예상되는 참값 : [7, 10 ,11 ,12]
print(sess.run(linear_model, feed_dict={x:x_test}))
sess.close()

 

 > 텐서보드를 이용한 그래프 시각화

손실함수 정의 코드 밑에 코드 추가

## 텐서보드를 위한 요약정보(scalar)를 정의
tf.summary.scalar('loss', loss) ## 무엇을 관찰할지 위에있는 변수중에서 써야함

 > for문안에 run하는 모든 정보를 갖고 있어야함. 코드추가

 - ~~_writer.add_summary(summary,i) : add해주면서 갖고온 정보를 주는데 스텝은 i로 넘어가게됨.

## 텐서보드 요약정보들을 하나로 합친
merged = tf.summary.merge_all()
## 텐서보드 summary 정보들을 저장할 폴더 경로를 설정
tensorboard_writer = tf.summary.FileWriter('./tensorboard_log', sess.graph)

## 경사하강법을 1000번 수행
for i in range(1000) :
    sess.run(train_step, feed_dict={x:x_train, y:y_train})
    
    ## 스텝마다 텐서보드 요약 정보 값들을 계산해서 지정한 경로에 저장
    summary = sess.run(merged, geed_dict={x:x_train, y:y_train})
    tensorboard_writer.add_summary(summary, i)

> 실행한뒤 아나콘다에서 확인

tensorboard_log 가 생긴것을 알 수 있음!

-> edge에서 실행

 아래와 같이 인터넷 session을 통해 시각화된 그래프를 볼 수 있음