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)
こんな感じで減少していくのが確認できる。