首先来看关于Summary的介绍(From 【TensorFlow动手玩】常用集合: Variable, Summary, 自定义):
Summary
Summary
被收集在名为tf.GraphKeys.SUMMARIES
的colletion
中
定义
Summary
是对网络中Tensor
取值进行监测的一种Operation
。这些操作在图中是“外围”操作,不影响数据流本身。注意:Summary本身也是一个op
1.1 Tensorboard的数据形式
Tensorboard可以记录与展示以下数据形式:
(1)标量Scalars
(2)图片Images
(3)音频Audio
(4)计算图Graph
(5)数据分布Distribution
(6)直方图Histograms
(7)嵌入向量Embeddings
1.2 Tensorboard的可视化过程
(1)首先肯定是先建立一个graph,你想从这个graph中获取某些数据的信息
(2)确定要在graph中的哪些节点放置summary operations以记录信息
使用tf.summary.scalar记录标量
使用tf.summary.histogram记录数据的直方图
使用tf.summary.distribution记录数据的分布图
使用tf.summary.image记录图像数据
….
(3)operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。sess.run(op) 或者sess.run(op->依赖之)
而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是呢,一份程序下来可能有超多这样的summary 节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。
(4)使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中
(5)运行整个程序,并在命令行输入运行tensorboard的指令,之后打开web端可查看可视化的结果
用例
我们模仿常见的训练过程,创建一个最简单的用例。
# 迭代的计数器
global_step = tf.Variable(0, trainable=False)
# 迭代的+1操作
increment_op = tf.assign_add(global_step, tf.constant(1))
# 实例应用中,+1操作往往在`tf.train.Optimizer.apply_gradients`内部完成。
# 创建一个根据计数器衰减的Tensor
lr = tf.train.exponential_decay(0.1, global_step, decay_steps=1, decay_rate=0.9, staircase=False)
# 把Tensor添加到观测中
tf.scalar_summary('learning_rate', lr)
# 并获取所有监测的操作`sum_opts`
sum_ops = tf.merge_all_summaries()
# 初始化sess
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init) # 在这里global_step被赋初值
# 指定监测结果输出目录
summary_writer = tf.train.SummaryWriter('/tmp/log/', sess.graph)
# 启动迭代
for step in range(0, 10):
s_val = sess.run(sum_ops) # 获取serialized监测结果:bytes类型的字符串
summary_writer.add_summary(s_val, global_step=step) # 写入文件
sess.run(increment_op) # 计数器+1
调用tf.scalar_summary系列函数时,就会向默认的collection
中添加一个Operation
。
再次回顾“零存整取”原则:创建网络的各个层次都可以添加监测;在添加完所有监测,初始化sess之前,统一用tf.merge_all_summaries获取。
查看
SummaryWriter文件中存储的是序列化的结果,需要借助TensorBoard才能查看。
在命令行中运行tensorboard,传入存储SummaryWriter文件的目录:
tensorboard --logdir /tmp/log
完成后会提示:
You can navigate to http://127.0.1.1:6006
可以直接使用服务器本地浏览器访问这个地址(本机6006端口),或者使用远程浏览器访问服务器ip地址的6006端口。
参考资料: