최근 저는 텐서플로우로 간단한 Hello World 수준의 예제를 한 번 다뤄보고[바로가기], 그 후에 변수의 히스토리를 Python list형으로 저장해서 학습이 완료된 후에 확인해보는 것[바로가기]을 다루고난 후, 입력 변수가 2개, 출력 변수가 1개인 경우의 선형회귀(Linear Regression) 문제를 텐서플로우로 확인하는 예제[바로가기]도 다루어 보았습니다. 이제 텐서플로우에서 참 유용하게 사용하는 텐서보드(Tensor Board)를 소개하려고 합니다. 이전에 정말 초급모드로 다룬적[바로가기]이 있습니다만, 그 때는 저 자신도 그게 뭔지도 모르고 그냥 이렇게 하니 되네요~~하고 이야기했던 거라 다시 다뤄보고 싶었습니다.
이제... 텐서보드를 사용하기 위해 어떻게 해야하는지 보도록 하겠습니다. 예제는 AND를 학습하겠다는 정말 기초적인 첫 예제[바로가기]를 살짝 바꾸는 걸로 하겠습니다.
import tensorflow as tf import numpy as np from tqdm import tqdm_notebook import matplotlib.pyplot as plt %matplotlib inline # AND x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32) y_data = np.array([[0], [0], [0], [1]], dtype=np.float32) X = tf.placeholder(tf.float32, [None, 2], name='x-input') Y = tf.placeholder(tf.float32, [None, 1], name='y-input')
먼저 당시 그 예제와 동일하게 설정을 진행하구요...
with tf.name_scope("layer") as scope: W = tf.Variable(tf.random_normal([2, 1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias') hypothesis = tf.sigmoid(tf.matmul(X, W) + b) w_hist = tf.summary.histogram("weight", W) b_hist = tf.summary.histogram("bias", b) hypothesis_hist = tf.summary.histogram("hypothesis", hypothesis)
저렇게... with
구문으로 tf.name_scope
를 사용하면 나중에 위 코드 안에 있는 W
, b
, hypothesis
를 하나로 묶어서 보여주기 때문에 이쁘게 보입니다. 그리고 histogram
으로 보고 싶은 변수는 tf.summary.histogram
으로 변수를 잡아 주면 됩니다.
with tf.name_scope("cost") as scope: cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis)) cost_summ = tf.summary.scalar("cost", cost) with tf.name_scope("train") as scope: train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
그리고... scalar
로 cost
를 보고 싶다면 tf.summary.scalar
로 잡으면 됩니다. 그냥 보기 좋게 tf.name_scope
를 with
만 잡으면 되구요.
# Accuracy computation # True if hypothesis>0.5 else False predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32) accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32)) accuracy_summ = tf.summary.scalar("accuracy", accuracy)
이제... predicted
와 accuracy
는 원래 하던대로 잡았고, accuracy만 scalar로 보고 싶어서 tf.summary.scalar
로 잡아 주었습니다.
# Launch graph with tf.Session() as sess: # tensorboard --logdir=./logs merged_summary = tf.summary.merge_all() writer = tf.summary.FileWriter("./logs/hello_tf_180115-1") writer.add_graph(sess.graph) # Show the graph # Initialize TensorFlow variables sess.run(tf.global_variables_initializer()) for step in tqdm_notebook(range(10001)): summary, _ = sess.run([merged_summary, train], feed_dict={X: x_data, Y: y_data}) writer.add_summary(summary, global_step=step) # Accuracy report h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data}) print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a)
그래프를 launch하는 부분에서는... tf.summary.merge_all()
명령으로 변수를 잡아서 그걸 sess.run
으로 train
을 돌릴때 같이 돌려주면 됩니다. 그리고, tf.summary.FileWriter
를 이용해서 log를 기록할 폴더를 지정해 주면 됩니다. 그리고 중간중간 accuracy
를 print하는 것 보다 [바로가기]에서 이야기한 TQDM
을 사용해서 progress bar를 보게 해도 되지요^^ 위 블럭을 실행할때는...
저렇게 떠서... 남은 시간을 예상해볼 수도 있구요...
또 다 실행되고 나서는 저 코드를 실행하기 위해 들어간 시간등을 확인해 볼 수도 있지요^^ 아까 그래프를 실행할 때 사용한 FileWriter에서 지정한 폴더로 터미널을 이용해서 이동합니다.
그리고 tensorboard --logdir=./hello_tf_180115-1/
이라고 입력하면 위에 나타나듯이 6006
이라고 포트넘버가 나타납니다.
이제.. localhost:6006
이라고 웹 브라우저에서 입력하면 이쁘게 잘 저 화면이 나타납니다.^^
전체 그래프의 구조도 확인할 수 있구요... tf.name_scope
로 묶은 train, cost와 layer도 하나의 블럭처럼 이쁘게 보이네요.
layer를 열어보니, weight(2*1)와 bias와 함께 hypothesis가 표현되어 있음을 알 수 있습니다.
또한... weight와 bias의 히스토리를 히스토그램으로도 확인할 수 있습니다.
만약.. 한 폴더에 비교하고 싶은 결과를 저렇게 따로 저장해두고, 위 그림처럼 XOR폴더를 텐서보드에서 읽으면
다수의 결과를 동시에 비교해 볼 수 있습니다.
이런 기능을 사용할 수 있다는 것이 텐서플로우의 큰 장점인것 같습니다.^^
'Theory > DeepLearning' 카테고리의 다른 글
[Tensor Flow] 신경망을 조금 더 깊게 하고 xavier_initializer를 이용해서 MNIST 숫자 판독해보기 (30) | 2018.04.09 |
---|---|
[Keras] 케라스로 풀어보는 다변수 입력에 대한 선형회귀 예제 - 나이, 체중에 대한 혈액지방함량 문제- (18) | 2018.04.06 |
[Tensor Flow] 단층 신경망으로 텐서플로우를 이용해서 MNIST 숫자 판독해보기 (18) | 2018.03.02 |
[Tensor Flow] XOR 문제를 해결하기 위해 은닉층(Hidden Layer)를 하나 추가해 보기 (20) | 2018.02.19 |
[Tensor Flow] 텐서플로우로 풀어보는 다변수 입력에 대한 선형회귀 예제 - 나이, 체중에 대한 혈액지방함량 문제- (26) | 2018.01.30 |
[Tensor Flow] 간단한 텐서플로우 예제에서 원하는 변수 히스토리 만들기 (16) | 2018.01.27 |
[Tensor Flow] 간단한 예제로 텐서플로우 시작해보기 (20) | 2018.01.25 |