TensorFlow中 tensorboard 工具通过读取在网络训练过程中保存到本地的日志文件实现数据可视化,日志数据保存主要用到 tf.summary 中的方法。
summary.py定义在tensorflow/python/summary/summary.py。提供了像tf.summary.scalar、tf.summary.histogram 等方法,用来把graph图中的相关信息,如结构图、学习率、准确率、Loss等数据转换成 protocol buffer 数据格式,然后再调用 writer.py里的tf.summary.FileWriter 类,调用其add_summary方法把这些数据写入到本地硬盘,之后就可以借用 tensorboard 工具可视化这些数据
一、summary.py的函数
1、tf.summary.scalar
用于保存标量或单个数值,一般用来保存loss,accuary,学习率等数据,比较常用
tf.summary.scalar(name,tensor,collections=None,family=None)
name:要保存的数据的命名。在TensorBoard中也用作系列名称。
tensor:要可视化的数据,张量。在scalar函数中应该是一个标量,如当前的学习率、Loss等
collections:定义保存的数据归于哪个集合。默认为[GraphKeys.SUMMARIES]
family:如果定义,在Tensorboard显示的时候,将作为前缀加在变量名前
2、tf.summary.histogram
输出带直方图的汇总的protocol buffer数据,一般用来显示训练过程中变量的分布情况
tf.summary.histogram(name,values,collections=None,family=None)
values:要可视化的数据,可以是任意形状和大小的张量数据
其它三个参数跟上面一样。
3、tf.summary.image
输出带图像的protocol buffer数据,汇总数据的图像的的形式如下: ’ tag /image/0’, ’ tag /image/1’…,如:input/image/0等。
tf.summary.image(name,tensor,max_outputs=3,
collections=None,
family=None)
tensor:形状为[批量数、高度、宽度、通道数]的4阶张量,类型为 uint8 或 float32 ,其中通道数为1、3或4。
max_outputs:生成图像的批处理元素的最大数目。
其它同上。
4、tf.summary.audio
输出带音频的protocol buffer数据。音频是由张量构建的,张量必须是三维的[批量大小,帧,通道数]或二维的[批量大小,帧]。
tf.summary.audio(name,tensor,sample_rate,
max_outputs=3,
collections=None,
family=None)
tensor:形状为[批量大小,帧,通道数]的三阶张量或形状[批量大小,帧]的二阶张量。类型为float32
sample_rate:以赫兹表示的信号采样率的标量float32张量。
max_outputs:为其生成音频的批处理元素的最大数目
其它同上
5、tf.summary.merge
对指定的多个值进行联合输出。运行op时,如果要合并的摘要中的多个值使用同一个标记,则会报告InvalidArgument错误。
tf.summary.merge(inputs,collections=None,name=None)
inputs:包含protocol buffers数据的字符串张量列表
collections:定义保存的数据归于哪个集合。默认为[]
name:操作的名称
6、tf.summary.merge_all
对所有值进行联合输出。可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了
tf.summary.merge_all(key=tf.GraphKeys.SUMMARIES,scope=None,name=None)
key:定义保存的数据归于哪个集合。默认为[GraphKeys.SUMMARIES]
scope:用于筛选摘要操作的可选范围,使用re.match
name:操作的名称
二、text_summary.py的函数
8、tf.summary.text
用于将文本类型的张量数据转换成张量写入summary中
tf.summary.text(name,tensor,collections=None)
name:要生成的数据的命名。在TensorBoard中也用作系列名称。
tensor:要转换的字符串类型张量
collections:定义保存的数据归于哪个集合。默认为[GraphKeys.SUMMARIES]
如:
text = """/a/b/c\\_d/f\\_g\\_h\\_2019"""
summary_op0 = tf.summary.text('text', tf.convert_to_tensor(text))
-->b'\n/\n\x04textB\x1d\x08\x07\x12\x00B\x17/a/b/c\\_d/f\\_g\\_h\\_2019J\x08\n\x06\n\x04text'
三、FileWriter类
9、tf.summary.FileWriter
是一个类,定义在tensorflow/python/summary/writer/writer.py。其作用是将总结的协议缓冲区写入事件文件中。这个类提供了一套完整的机制在给定的目录中创建一个事件文件,然后在其中添加summary和事件。而且这个类是异步地(asynchronously)来更新文件内容,意味着你能够调用直接从训练循环向文件添加数据的方法,而不会减慢训练。其初始化函数如下:
def __init__(self,
logdir,
graph=None,
max_queue=10,
flush_secs=120,
graph_def=None,
filename_suffix=None,
session=None):
logdir:事件文件要保存的目录
graph: graph(图)对象,例如 sess.graph
max_queue:队列中事件和概要的最大数量,默认为10;
flush_secs:事件和概要保存到本地磁盘的间隔,默认120S;
graph_def: 旧版本的graph,已弃用;
filename_suffix:可选参数,事件文件的后缀。
其有一个add_summary()方法用于将训练过程数据保存在FileWriter对象指定的logdir文件中。
add_summary(self, summary, global_step=None)
close() 方法是把事件文件写到硬盘,并且关闭文件,一般是在不再需要writer的时候调用这个函数。
用法示例:
tf.summary.scalar('accuracy',acc) #生成准确率标量图
merge_summary = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(dir,sess.graph)#定义一个写入summary的目标文件的对象,dir为写入文件地址
......(交叉熵、优化器等定义)
for step in xrange(training_step): #训练循环
train_summary = sess.run(merge_summary,feed_dict = {...})#调用sess.run运行图,生成一步的训练过程数据
train_writer.add_summary(train_summary,step)#调用train_writer的add_summary方法将训练过程以及训练步数保存
train_writer.close()
参考:https://www.cnblogs.com/lyc-seu/p/8647792.html