edo1z blog

プログラミングなどに関するブログです

TensorFlow - TensorBoard

TensorBoardを使うと、設定したノード間の繋がりや、訓練状況等をグラフで表示できます。

シンプルな使い方

コードサンプル

import tensorflow as tf

a = tf.constant(2)
b = tf.constant(3)
add = tf.add(a, b)

with tf.Session() as sess:
    tf.summary.FileWriter('.\logs', sess.graph)
    sess.run(add)

tf.summary.FileWriter()の第一引数はTensorBoard用ログファイルの保存ディレクトリパスです。FileWriterを使うと、あとはsess.runで何かを実行すると勝手にログに保存されます。

TensorBoardの起動

TensorFlowをPIPでインストールしてない場合は、下記使えないかもしれない。

$ tensorboard --logdir=./logs

実行すると、下記のようなのが出てくるので、そこにブラウザでアクセスすると確認できます。

(You can navigate to http://192.168.99.1:6006)

正解率のグラフを表示させてみる

下記コードで、正解率accuracyの推移をTensorBoardで表示させています。

やり方

下記で、accuracyという名前のグラフを、accuracyという変数の値で作成できます。

tf.summary.scalar('accuracy', accuracy)

tf.summary.scalar等を利用した場合、tf.summary.merge_all()という関数を使う必要があります。

merged = tf.summary.merge_all()

sess.run時に、上記のmergedも一緒に実行して、その結果を、下記のようにしてTensorBoardに追加します。

writer.add_summary(summary, i)

コードサンプル

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('.\mnist', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])
w = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, w) + b)
t = tf.placeholder(tf.float32, [None, 10])
loss = -tf.reduce_sum(t * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer().minimize(loss)
correct = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

tf.summary.scalar('accuracy', accuracy)
merged = tf.summary.merge_all()

with tf.Session() as sess:
    writer = tf.summary.FileWriter('.\logs', sess.graph)
    sess.run(tf.global_variables_initializer())
    for i in range(1500):
        batch = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={x:batch[0], t:batch[1]})
        if not i % 100:
            summary, acc = sess.run([merged, accuracy], feed_dict={x:mnist.test.images, t:mnist.test.labels})
            writer.add_summary(summary, i)
            print('Step: %d, Accuracy: %f' % (i, acc))
writer.close()

グループ分けして、Graphを見やすくする

下記のように、with tf.name_scope('グループ名'):でくくったものは、表示されるグラフでもくくられます。

with tf.name_scope('accuracy'):
    correct = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1))
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

コードサンプル

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('.\mnist', one_hot=True)

with tf.name_scope('input'):
    x = tf.placeholder(tf.float32, [None, 784])
    w = tf.Variable(tf.zeros([784, 10]))
    b = tf.Variable(tf.zeros([10]))

with tf.name_scope('output'):
    y = tf.nn.softmax(tf.matmul(x, w) + b)

with tf.name_scope('loss'):
    t = tf.placeholder(tf.float32, [None, 10])
    loss = -tf.reduce_sum(t * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))

with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer().minimize(loss)

with tf.name_scope('accuracy'):
    correct = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1))
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

tf.summary.scalar('accuracy', accuracy)
merged = tf.summary.merge_all()

with tf.Session() as sess:
    writer = tf.summary.FileWriter('.\logs', sess.graph)
    sess.run(tf.global_variables_initializer())
    for i in range(1500):
        batch = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={x:batch[0], t:batch[1]})
        if not i % 100:
            summary, acc = sess.run([merged, accuracy], feed_dict={x:mnist.test.images, t:mnist.test.labels})
            writer.add_summary(summary, i)
            print('Step: %d, Accuracy: %f' % (i, acc))
writer.close()

こんな感じで見やすくなります。