mirror of
https://github.com/Estom/notes.git
synced 2026-04-24 18:42:39 +08:00
apacheCNml&dl
This commit is contained in:
272
Tensorflow/TensorFlow1.0/TensorFlow-Summary&Tensorboard.md
Normal file
272
Tensorflow/TensorFlow1.0/TensorFlow-Summary&Tensorboard.md
Normal file
@@ -0,0 +1,272 @@
|
||||
## 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)
|
||||
```
|
||||
Reference in New Issue
Block a user