最近在写tensorflow的程序,想看看训练过程中损失函数等变化,打算用用tensorboard。
tensorboard是tensorflow的可视化工具,可以显示图、展示中间结果。
相关链接:https://tensorflow.google.cn/get_started/summaries_and_tensorboard
代码如下:
tensorboard是tensorflow默认自带的模块,专门用来结果可视化。主要用的就是tf.summary。
1.定义:
这个模块我们主要使用的就是tf.sumary.histogram和tf.summary.scalar。这两个类在代码里类似tf的变量、占位符等,都在图中定义。
tf.sumary.histogram:直方图,只要展示tensor的分布,并不能表示tensor的值。
主要参数如下,
tf.sumary.histogram(name, values, collections=None, family=None):
name: string,表示在tensorboard显示的名称
values: tensor,一般是多维tensor
collections: 表示将这个类加入到哪个集合中。
family: 类似命名前缀。一般只要你在定义图的时候进行了命名空间定义,如name_scope、variable_scope,就不需要这family了。
展示一下我测试时的结果(大家看个样子就行了,不要在意结果是什么样子)
tf.summary.scalar:标量,只能展示一个实数值,也就是一般用来显示准确度、损失等,而不能用来展示训练好的权重矩阵或者向量。
参数和直方图类似,只是values/tensor必须满足是单值实数。
依旧秀一张丑图:
多条线是因为我跑了很多次。
2.Writer
writer = tf.summary.FileWriter('./graph',sess.graph)
这是一个用来保存图的类,因为如果上一步,你什么要看的(直方图、标量)都没有,也是可以展示你的图的。
偷懒了,直接上源码的解释,logdir 存储地址,graph 就是定义的图
def__init__(self,logdir,graph=None,max_queue=10
,flush_secs=120,graph_def=None,filename_suffix=None):
Args:
logdir: A string. Directory where event file will be written.
graph: A `Graph` object, such as `sess.graph`.
max_queue: Integer. Size of the queue for pending events and summaries.
flush_secs: Number. How often, in seconds, to flush the
pending events and summaries to disk.
graph_def: DEPRECATED: Use the `graph` argument instead.
filename_suffix: A string. Every event file's name is suffixed with
`suffix`.
3.打包
merged = tf.summary.merge_all()
这里就更加不求甚解了,直接把前面第一步定义的summary节点,打包,便于下面run。这里就不展示参数什么的了。
4.run
eval_c,eval_summary = sess.run([c,merged])
5.写入writer
writer.add_summary(eval_summary,i)
后面的i就是绘制图的时间(step)轴,如果没有后面的参数,只会写最后一个。
程序的最后记得writer.close()
6.展示
跑完之后,要展示需要在命令行运行 tensorboard --logdir="./graph"
接着用浏览器登入http://127.0.0.1:6006/ 就能看结果,但是一定要关掉VPN的全局模式,我就因为这个迷茫了半天,不知道自己错在哪里。