TensorBoardで処理を可視化する

概要

TensorFlowのTensorBoardを使って単純な処理を可視化してみる。

公式サイトのTensorBoard: Visualizing Learningを参考に。

@CretedDate 2016/05/03
@Versions python3.4.3 tensorflow0.8.0

1 + 2を可視化する

定数で1 + 2をするだけの処理でグラフを書いてみる。

import tensorflow as tf

# 定数で1 + 2
x = tf.constant(1, name='x')
y = tf.constant(2, name='y')
z = x + y

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    sess.run(z)
    # SummaryWriterでグラフを書く
    summary_writer = tf.train.SummaryWriter('data', graph=sess.graph)
    tf.scalar_summary('one_plus_one_summary', z)

SummaryWriterでディレクトリ名をdataと指定しているので、下記のように実行するとTensorBoardは立ち上がる。

$ tensorboard --logdir=data

こうすると下記のようなグラフが表示される。

graph

式を z = x * y + y にするとこんな感じ。

graph

(1 + 2) * 2を可視化する(name scope付き)

name scopeを付けることで可視化する領域をまとめてわかりやすくできる。

import tensorflow as tf

# 足し算
with tf.name_scope('add_scope'):
    x = tf.constant(1, name='x')
    y = tf.constant(2, name='y')
    z = x + y

# 上の結果に掛け算
with tf.name_scope('multiply_scope'):
    zz = y * z

with tf.Session() as sess:
    with tf.name_scope('init_scope'):
        sess.run(tf.initialize_all_variables())
    sess.run(zz)
    # グラフを書こう
    summary_writer = tf.train.SummaryWriter('data', graph=sess.graph)
    tf.scalar_summary('one_plus_one_summary', zz)

graph

上述の例ではaddとmutiplyを入れ子のnamespaceにしている。

別々のnamespaceに入れるとこんな感じ。

graph

手書き文字認識のグラフも見てみる

もう少し複雑なグラフとして、チュートリアルにも出てくる手書き文字認識をグラフにしてみる。

できるだけ簡易にsoftmax一発で。

import tensorflow as tf 

# mnist手書きデータの用意
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# softmaxでgradient discentする簡易な記述
images = tf.placeholder(tf.float32, shape=[None, 784])
labels = tf.placeholder(tf.float32, shape=[None, 10])
weights = tf.Variable(tf.zeros([784,10]))
softmax = tf.nn.softmax(tf.matmul(images, weights))
cross_entropy = -tf.reduce_sum(labels * tf.log(softmax))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    batch_images, batch_labels = mnist.train.next_batch(1000)
    sess.run(train_step, feed_dict={images:batch_images, labels:batch_labels})
    summary_writer = tf.train.SummaryWriter('data', graph=sess.graph)
    tf.scalar_summary('cross_entropy', cross_entropy)

graph

クリックで拡大。

name_scopeを設定するともう少し見やすくなる。

Tutorialのコードのmnist.pyとfully_connected_feed.pyにそのあたりも設定したコードが書かれている。

loss functionの変動幅を見る

GradientDescentOptimizerで勾配がだんだん緩やかになってくのをTensorGraphで確認する。

tf.merge_all_summaries()でsummaryが取れるらしい。その前にtf.scalar_summaryでsummaryを出す処理を指定しておく。

import tensorflow as tf

# mnist手書きデータの用意
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# softmaxでgradient discentする簡易な記述
images = tf.placeholder(tf.float32, shape=[None, 784])
labels = tf.placeholder(tf.float32, shape=[None, 10])
weights = tf.Variable(tf.zeros([784,10]))
softmax = tf.nn.softmax(tf.matmul(images, weights))
cross_entropy = -tf.reduce_sum(labels * tf.log(softmax))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# sessionの用意
sess = tf.Session()
sess.run(tf.initialize_all_variables())

# summaryの設定
tf.scalar_summary('cross_entropy', cross_entropy)
summary_op = tf.merge_all_summaries()
summary_writer = tf.train.SummaryWriter('data', graph=sess.graph)

# 100回実行してcross_entropyのsummaryを記録
for step in range(100):
    batch_images, batch_labels = mnist.train.next_batch(100)
    feed_dict = {images:batch_images, labels:batch_labels}
    sess.run([train_step, cross_entropy], feed_dict=feed_dict)
    summary_str = sess.run(summary_op, feed_dict=feed_dict)
    summary_writer.add_summary(summary_str, step)

こんな感じで減少していくのが確認できる。

graph