TensorFlowのTensorBoardを使って単純な処理を可視化してみる。
公式サイトのTensorBoard: Visualizing Learningを参考に。
定数で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
こうすると下記のようなグラフが表示される。
式を z = x * y + y にするとこんな感じ。
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)
上述の例ではaddとmutiplyを入れ子のnamespaceにしている。
別々のnamespaceに入れるとこんな感じ。
もう少し複雑なグラフとして、チュートリアルにも出てくる手書き文字認識をグラフにしてみる。
できるだけ簡易に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)
クリックで拡大。
name_scopeを設定するともう少し見やすくなる。
Tutorialのコードのmnist.pyとfully_connected_feed.pyにそのあたりも設定したコードが書かれている。
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)
こんな感じで減少していくのが確認できる。