Tensor Board


Serializing the data

summary data는 Tensor Flow실행 중에 생성된 데이터를 담고 있다.

아래는 일반적인 Tensor Board의 lifecycle을 담고 있다.

  1. TensorFlow Graph를 생성 한다. 그것은 어떻게 summary 데이터를 수집할지에 대한 정보를 담고 있다.

예를 들어서 scalar_summary를 이용해서 loss function의 진행상황을 기록할 수 있다.
추가로 gradient weight를 하고 싶다면histogram_summary를 사용 한다.

  1. summary들을 초기화 해주어야 한다.
    그것을 일일이 하나하나 하는것은 tedious한 방법이니tf.summary.merge_all을 실행 시키면single operation으로 모든 summary data를 초기화 하게 된다.

  2. 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})

실행방법

  1. chrome 브라우저를 사용한다.
  2. 전체 경로를 설정해야한다.

아래와 같이 log file이 저장된 full path를 입력해주어야 한다.

tensorboard --logdir=/root/PycharmProjects/TensorFlowTest/logs/xor_logs/

정상적으로 실행이 됬다면 아래와 같은 메시지가 나온다.

Starting TensorBoard on port 6006
(You can navigate to http://localhost:6006)

그리고 웹브라우저 크롬을 이용해서 접속하면 아래와 같은 화면을 볼 수 있다.

위에 보면 메뉴바에
EVENTSIMAGESGRAPHHISTOGRAMS이렇게 4개의 메뉴가 있는것을 알 수 있다.
각각 우리가 설정한대로 데이터를 보여주게된다.

cost 값이 interation에 따라서 감소하는 것을 시각화 해서 알 수 있다.

생성한 Neural networks를 graph로 확인 할 수 있다.

참고자료


+ Recent posts