10 KiB
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)