Files
notes_estom/Tensorflow/TensorFlow1.0/TensorFlow-Summary&Tensorboard.md
yinkanglong_lab 68c2dbc3ac apacheCNml&dl
2021-03-20 16:02:39 +08:00

10 KiB
Raw Blame History

tensorflow 数据可视化

tf.summary

在TensorFlow中最常用的可视化方法有三种途径分别为TensorFlow与OpenCv的混合编程、利用Matpltlib进行可视化、利用TensorFlow自带的可视化工具TensorBoard进行可视化。

原理介绍

tf.summary中相关的方法会输出一个含tensor的Summary protocol buffer这是一种能够被tensorboard模块解析的结构化数据格式。

protocol buffer(protobuf)是谷歌专用的数据序列化工具。速度更快,但格式要求更严格,应用范围可能更小。

用法详解

1. tf.summary.scalar

用来显示标量信息:

tf.summary.scalar(tags, values, collections=None, name=None)
例如tf.summary.scalar('mean', mean)
一般在画loss,accuary时会用到这个函数。

参数说明:

  • name:生成节点的名字也会作为TensorBoard中的系列的名字。
  • tensor:包含一个值的实数Tensor。
  • collection图的集合键值的可选列表。新的求和op被添加到这个集合中。缺省为[GraphKeys.SUMMARIES]
  • family:可选项设置时用作求和标签名称的前缀这影响着TensorBoard所显示的标签名。

主要用途:

  • 将【计算图】中的【标量数据】写入TensorFlow中的【日志文件】以便为将来tensorboard的可视化做准备。
  • 一般在画loss曲线和accuary曲线时会用到这个函数。
2. tf.summary.histogram

用来显示直方图信息,其格式为:

tf.summary.histogram(tags, values, collections=None, name=None) 
例如: tf.summary.histogram('histogram', var)
一般用来显示训练过程中变量的分布情况

参数说明:

  • name :一个节点的名字,如下图红色矩形框所示
  • values:要可视化的数据,可以是任意形状和大小的数据

主要用途:

  • 将【计算图】中的【数据的分布/数据直方图】写入TensorFlow中的【日志文件】以便为将来tensorboard的可视化做准备
  • 一般用来显示训练过程中变量的分布情况
3. tf.summary.distribution

分布图一般用于显示weights分布

4. tf.summary.text

可以将文本类型的数据转换为tensor写入summary中

text = """/a/b/c\\_d/f\\_g\\_h\\_2017"""
summary_op0 = tf.summary.text('text', tf.convert_to_tensor(text))
5. tf.summary.image

输出带图像的probuf汇总数据的图像的的形式如下 ' tag /image/0', ' tag /image/1'...input/image/0等。

tf.summary.image(tag, tensor, max_images=3, collections=None, name=None)

参数说明:

  • name :一个节点的名字,如下图红色矩形框所示
  • tensor:要可视化的图像数据一个四维的张量元素类型为uint8或者float32维度为[batch_size, height,width, channels]
  • max_outputs:输出的通道数量,可以结合下面的示例代码进行理解

主要用途:

  • 将【计算图】中的【图像数据】写入TensorFlow中的【日志文件】以便为将来tensorboard的可视化做准备

  • 输出一个包含图像的summary,这个图像是通过一个4维张量构建的这个张量的四个维度如下所示[batch_size,height, width, channels]

  • 其中参数channels有三种取值

    1: tensor is interpreted as Grayscale,如果为1那么这个张量被解释为灰度图像
    3: tensor is interpreted as RGB,如果为3那么这个张量被解释为RGB彩色图像
    4: tensor is interpreted as Grayscale,如果为4那么这个张量被解释为RGBA四通道图

6. tf.summary.audio

展示训练过程中记录的音频

7. tf.summary.merge_all

merge_all 可以将所有summary全部保存到磁盘以便tensorboard显示。如果没有特殊要求一般用这一句就可一显示训练时的各种信息了。

tf.summaries.merge_all(key='summaries')

参数说明:

  • key : 用于收集summaries的GraphKey默认的为GraphKeys.SUMMARIES
  • scope可选参数

函数说明:

  • 将之前定义的所有summary整合在一起
  • 和TensorFlow中的其他操作类似tf.summary.scalar、tf.summary.histogram、tf.summary.image函数也是一个op它们在定义的时候也不会立即执行需要通过sess.run来明确调用这些函数。因为在一个程序中定义的写日志操作比较多如果一一调用将会十分麻烦所以Tensorflow提供了tf.summary.merge_all()函数将所有的summary整理在一起。在TensorFlow程序执行的时候只需要运行这一个操作就可以将代码中定义的所有【写日志操作】执行一次从而将所有的日志写入【日志文件】。
8. tf.summary.FileWriter

指定一个文件用来保存图。可以调用其add_summary方法将训练过程数据保存在filewriter指定的文件中

tf.summary.FileWritter(path,sess.graph)

Tensorflow Summary 用法示例:

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方法将训练过程以及训练步数保存  

此时开启tensorborad

tensorboard --logdir=/summary_dir 

便能看见accuracy曲线了。

9. tf.summary.merge

可以调用其add_summary方法将训练过程数据保存在filewriter指定的文件中

tf.summary.merge(inputs, collections=None, name=None)

一般选择要保存的信息还需要用到tf.get_collection()函数

tf.summary.scalar('accuracy',acc)                   #生成准确率标量图  
merge_summary = tf.summary.merge([tf.get_collection(tf.GraphKeys.SUMMARIES,'accuracy'),...(其他要显示的信息)])  
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方法将训练过程以及训练步数保存  

使用tf.get_collection函数筛选图中summary信息中的accuracy信息这里的

tf.GraphKeys.SUMMARIES 是summary在collection中的标志。

当然,也可以直接:

acc_summary = tf.summary.scalar('accuracy',acc)                   #生成准确率标量图  
merge_summary = tf.summary.merge([acc_summary ,...(其他要显示的信息)])  #这里的[]不可省

如果要在tensorboard中画多个数据图需定义多个tf.summary.FileWriter并重复上述过程。

步骤说明

  • summary记录的tensor
  • 使用merge_all或者merge函数收集所有的summary
  • 定制summary的存储对象
  • 运行summary按照训练步骤传入测试数据提取summary的值
  • 最后将summary的结果添加到日志当中

如果目标网址不行可以尝试localhost:6006

代码示例

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 也能成功运行了

x_data = tf.placeholder("float32",[None,784])
# x_data = tf.placeholder("float32",[100,784])

weight = tf.Variable(tf.ones([784,10]))
bias = tf.Variable(tf.ones([10]))
y_model = tf.nn.softmax(tf.matmul(x_data,weight)+bias)
y_data = tf.placeholder("float32",[None,10])
# y_data = tf.placeholder("float32",[100,10])

loss = tf.reduce_sum(tf.pow((y_model-y_data),2))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(fetches=init)

# 用来显示loss
tf.summary.scalar("loss",loss)

# 用来计算准确度
correct_prediction = tf.equal(tf.argmax(y_model, 1), tf.argmax(y_data, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
summary_acc = tf.summary.scalar("acc", accuracy)

# 用来显示weight的训练过程
tf.summary.histogram("weight",weight)

# 用来显示bias的训练过程
tf.summary.histogram("bias",bias)

# 用来将所有的summary收集起来
summary_merge = tf.summary.merge_all()
# 定义了一个文件读写对象用来写入summary的probuf到文件当中
summary_writer = tf.summary.FileWriter('mnist_logs', sess.graph)


for _ in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step,feed_dict={x_data:batch_xs,y_data:batch_ys})
    # 调用sess.run运行图生成一步的训练过程数据
    summary_trian = sess.run(summary_merge, feed_dict={x_data:mnist.test.images,y_data:mnist.test.labels})
    # 调用train_writer的add_summary方法将训练过程以及训练步数保存
    summary_writer.add_summary(summary_trian, _)


网上的一份不错的代码

 1 import tensorflow as tf
 2 import numpy as np
 3 
 4 ## prepare the original data
 5 with tf.name_scope('data'):
 6      x_data = np.random.rand(100).astype(np.float32)
 7      y_data = 0.3*x_data+0.1
 8 ##creat parameters
 9 with tf.name_scope('parameters'):
10      with tf.name_scope('weights'):
11             weight = tf.Variable(tf.random_uniform([1],-1.0,1.0))
12            tf.summary.histogram('weight',weight)
13      with tf.name_scope('biases'):
14            bias = tf.Variable(tf.zeros([1]))
15            tf.summary.histogram('bias',bias)
16 ##get y_prediction
17 with tf.name_scope('y_prediction'):
18      y_prediction = weight*x_data+bias
19 ##compute the loss
20 with tf.name_scope('loss'):
21      loss = tf.reduce_mean(tf.square(y_data-y_prediction))
22      tf.summary.scalar('loss',loss)
23 ##creat optimizer
24 optimizer = tf.train.GradientDescentOptimizer(0.5)
25 #creat train ,minimize the loss 
26 with tf.name_scope('train'):
27      train = optimizer.minimize(loss)
28 #creat init
29 with tf.name_scope('init'): 
30      init = tf.global_variables_initializer()
31 ##creat a Session 
32 sess = tf.Session()
33 #merged
34 merged = tf.summary.merge_all()
35 ##initialize
36 writer = tf.summary.FileWriter("logs/", sess.graph)
37 sess.run(init)
38 ## Loop
39 for step  in  range(101):
40     sess.run(train)
41     rs=sess.run(merged)
42     writer.add_summary(rs, step)