Tensor Board
Serializing the data
summary data는 Tensor Flow
실행 중에 생성된 데이터를 담고 있다.
아래는 일반적인 Tensor Board의 lifecycle을 담고 있다.
TensorFlow Graph
를 생성 한다. 그것은 어떻게 summary 데이터를 수집할지에 대한 정보를 담고 있다.
예를 들어서 scalar_summary를 이용해서 loss function의 진행상황을 기록할 수 있다.
추가로gradient weight
를 하고 싶다면histogram_summary
를 사용 한다.
summary들을 초기화 해주어야 한다.
그것을 일일이 하나하나 하는것은 tedious한 방법이니tf.summary.merge_all
을 실행 시키면single operation
으로 모든summary data
를 초기화 하게 된다.merged summary op
를 실행 한다.
그리고 probuf 데이터는 결국tf.train.SummaryWriter
에 의해서 object로 기록된다.
사용방법 포인트
tf.global_variables_initializer().run()
전에merged = tf.summary.merge_all()
을 해도 된다.tf.summary.FileWriter
도 실행 해도 된다.
0.012 패치에 따른 API deplicated
init = tf.initialize_all_variables()
- tf.global_variables_initializer().run()
tf.histogram_summary
- tf.summary.histogram
- tf.summary.scalar
merged = tf.merge_all_summaries()
- merged = tf.summary.merge_all()
writer = tf.train.SummaryWriter("./logs/xor_logs", sess.graph_def)
- train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)
summary = sess.run(merged, feed_dict={X:x_data, Y:y_data})
좋은 코드 패턴 google
def feed_dict(train):
"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
if train or FLAGS.fake_data:
xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
k = FLAGS.dropout
else:
xs, ys = mnist.test.images, mnist.test.labels
k = 1.0
return {x: xs, y_: ys, keep_prob: k}
summary, _ = sess.run([merged, train_step],
feed_dict=feed_dict(True),
options=run_options,
run_metadata=run_metadata)
Troubleshooting
kenrel panic
tensorboard를 쓰기위해서 잘못된 naming을 사용하면 발생
InvalidArguementError
Jupyter Notebook의 오류인것 같다.
관련사이트: tensorflow/tensorflow#225
그냥 python3 name.py 로 실행하거나 kernel을 껏다가 다시키면 1번은 동작한다. 똑같은 코드라도 어딘 되고 안되는게 tensorboard가 아무래도 불안정 한것 같다.
5 steps of using tensorboard
From TF graph, decide which node you want to annotate
- with tf.name_scope("test") as scope:
- tf.histogram_summary("weights", W), tf.scalar_summary(“accuracy", accuracy)
모두다 병합해서 하나로 보여준다.
Merge all summaries
- merged = tf.merge_all_summaries()
Create writer
- writer = tf.train.SummaryWriter("/tmp/mnist_logs", sess.graph_def)
실행 시킨 결과를 보여준다.
Run summary merge and add_summary
- summary = sess.run(merged, …); writer.add_summary(summary);
Launch Tensorboard
- tensorboard --logdir=/tmp/mnist_logs
Name variables
X = tf.placeholder(tf.float32, name='X-input')
Y = tf.placeholder(tf.float32, name='Y-input')
W1 = tf.Variable(tf.random_uniform([2, 2], -1.0, 1.0), name='Weight1')
W2 = tf.Variable(tf.random_uniform([2, 1], -1.0, 1.0), name='Weight2')
b1 = tf.Variable(tf.zeros([2]), name="Bias1")
b2 = tf.Variable(tf.zeros([1]), name="Bias2")
Add scope for between graph hierarchy
# Our hypothesis
with tf.name_scope("layer2") as scope:
L2 = tf.sigmoid(tf.matmul(X, W1) + b1)
with tf.name_scope("layer3") as scope:
hypothesis = tf.sigmoid(tf.matmul(L2, W2) + b2)
# Cost function
with tf.name_scope("cost") as scope:
cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))
cost_summ = tf.scalar_summary("cost", cost)
# Minimize
with tf.name_scope("train") as scope:
a = tf.Variable(0.1) # Learning rate, alpha
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)
Add histogram
# Add histogram
w1_hist = tf.histogram_summary("weights1", W1)
w2_hist = tf.histogram_summary("weights2", W2)
b1_hist = tf.histogram_summary("biases1", b1)
b2_hist = tf.histogram_summary("biases2", b2)
y_hist = tf.histogram_summary("y", Y)
Add scalar variables
# Cost function
with tf.name_scope("cost") as scope:
cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))
cost_summ = tf.scalar_summary("cost", cost)
merge summaries and create writer after creating session
# Launch the graph,
with tf.Session() as sess:
# tensorboard --logdir=./logs/xor_logs
merged = tf.merge_all_summaries()
writer = tf.train.SummaryWriter("./logs/xor_logs", sess.graph_def)
매번 기록하면 너무 log
데이터가 많으니 아래처럼 기술해 준다.
# Fit the line.
for step in xrange(20000):
sess.run(train, feed_dict={X:x_data, Y:y_data})
if step % 200 == 0:
summary = sess.run(merged, feed_dict={X:x_data, Y:y_data})
writer.add_summary(summary, step)
print step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W1), sess.run(W2)
실행 예제
아래의 실행 예제는 이전에 작성한 NN with XOR를 가지고 만든것이다.
전체코드
import tensorflow as tf
import numpy as np
xy = np.loadtxt('XORtrain.txt', unpack=True)
x_data = np.transpose(xy[0:-1])
y_data = np.reshape(xy[-1], (4, 1))
X = tf.placeholder(tf.float32, name='X-input')
Y = tf.placeholder(tf.float32, name='Y-input')
W1 = tf.Variable(tf.random_uniform([2, 2], -1.0, 1.0), name='Weight1')
W2 = tf.Variable(tf.random_uniform([2, 1], -1.0, 1.0), name='Weight2')
b1 = tf.Variable(tf.zeros([2]), name="Bias1")
b2 = tf.Variable(tf.zeros([1]), name="Bias2")
# Our hypothesis
with tf.name_scope("layer2") as scope:
L2 = tf.sigmoid(tf.matmul(X, W1) + b1)
with tf.name_scope("layer3") as scope:
hypothesis = tf.sigmoid(tf.matmul(L2, W2) + b2)
# Cost function
with tf.name_scope("cost") as scope:
cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))
cost_summ = tf.scalar_summary("cost", cost)
# Minimize
with tf.name_scope("train") as scope:
a = tf.Variable(0.1) # Learning rate, alpha
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)
# Add histogram
w1_hist = tf.histogram_summary("weights1", W1)
w2_hist = tf.histogram_summary("weights2", W2)
b1_hist = tf.histogram_summary("biases1", b1)
b2_hist = tf.histogram_summary("biases2", b2)
y_hist = tf.histogram_summary("y", Y)
# Before starting, initialize the variables. We will `run` this first.
init = tf.initialize_all_variables()
# Launch the graph,
with tf.Session() as sess:
# tensorboard --logdir=./logs/xor_logs
merged = tf.merge_all_summaries()
writer = tf.train.SummaryWriter("./logs/xor_logs", sess.graph_def)
sess.run(init)
# Fit the line.
for step in xrange(20000):
sess.run(train, feed_dict={X:x_data, Y:y_data})
if step % 200 == 0:
summary = sess.run(merged, feed_dict={X:x_data, Y:y_data})
writer.add_summary(summary, step)
print step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W1), sess.run(W2)
# Test model
correct_prediction = tf.equal(tf.floor(hypothesis+0.5), Y)
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print sess.run([hypothesis, tf.floor(hypothesis+0.5), correct_prediction, accuracy], feed_dict={X:x_data, Y:y_data})
print "Accuracy:", accuracy.eval({X:x_data, Y:y_data})
실행방법
- chrome 브라우저를 사용한다.
- 전체 경로를 설정해야한다.
아래와 같이 log file
이 저장된 full path를 입력해주어야 한다.
tensorboard --logdir=/root/PycharmProjects/TensorFlowTest/logs/xor_logs/
정상적으로 실행이 됬다면 아래와 같은 메시지가 나온다.
Starting TensorBoard on port 6006
(You can navigate to http://localhost:6006)
그리고 웹브라우저 크롬을 이용해서 접속하면 아래와 같은 화면을 볼 수 있다.
위에 보면 메뉴바에EVENTS
, IMAGES
, GRAPH
, HISTOGRAMS
이렇게 4개의 메뉴가 있는것을 알 수 있다.
각각 우리가 설정한대로 데이터를 보여주게된다.
cost 값이 interation에 따라서 감소하는 것을 시각화 해서 알 수 있다.
생성한 Neural networks를 graph로 확인 할 수 있다.
참고자료
'AI > TensorFlow, PyTorch, Keras, Scikit' 카테고리의 다른 글
Hands on TensorBoard TensorFlow Dev Summit-2017 (0) | 2017.03.15 |
---|---|
Transitioning to TensorFlow 1.0 (0) | 2017.02.28 |
Early Stopping 및 Index Shuffling (0) | 2017.01.03 |
Convolutional Neural Network (CNN) 구현 (4) | 2016.12.31 |
Convolutional Neural Network (CNN) 이론 (1) | 2016.12.31 |