tensorflow学习(三)TensorBoard可视化

利用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记录一下,也是为了好看