利用TensorBoard可以更好的了解深度学习训练过程以及参数的变化。思想是将tensorflow中的图的节点通过summary操作汇总到一起,再通过Ssummary.FileWriter写进protobuf,最后通过TensorBoard展示可视化结果。
Summary操作
tf.summary.scalar(name, values, collections=None)
tf.summary.image(name, tensor, max_outputs=None, collections=None)
tf.summary.histogram(name, values, collections=None)
tf.summary.merge(inputs, collections=None, name=None)
tf.summary.merge_all(key='summaries')
其中summary.scalar
显示任意一个向量的数据,比如学习率或者loss。
其中summary.image
可以显示节点中的4维的ndarray的数据。
其中summary.histogram
用来显示多个数据的分布情况
以上创建的节点通过merge_all
进行汇总合并。
SummaryWriter类
通过合并汇总后的protobuf对象传递给tf.summary.FileWriter
。其参数logdir
指定事件存储路径,add_graph
方法控制显示的图像。并通过session.run和add_summary
写入。
Demo
这里我们用一个loss accuracy做一个summary的TensorBoard的demo,代码如下:
# normal step
...
init = tf.global_variables_initializer()
tf.summary.scalar('loss', cost)
tf.summary.scalar('accuracy', accuracy)
merged_summary_op = tf.summary.merge_all()
with tf.Seesion() as sess:
sess.run(init)
summary_writer = tf.summary.FileWriter('/tmp/logs')
summary_writer.add_graph(sess.graph)
while step * batch_size < training_iters:
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})
if step % display_step == 0:
acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
summary_str = sess.run(merged_summary_op, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
summary_writer.add_summary(summary_str, step)
step += 1
启动TensorBoard
执行命令:
python tensorflow/tensorboard/tensorboard.py --logdir=/tmp/logs
或者直接执行
tensorboard --logdir=/tmp/logs
然后通过浏览器打开localhost:6006
,出来可视化界面后,就简单直观了,enjoy it!
tips
- 之前我的cnn代码里有valid_prediction,所以画出来的graph有两条分支,不太清晰,所以只留了train一个分支
- 多用with,进行包裹,这样才好看,正如官网说的,你的summary代码决定了你的图结构
- 不是所有的tensor都有必要记录,但是Variable和placeholder最好都用summary记录一下,也是为了好看