TensorFlow 提供了一个可视化工具 TensorBoard。他可以将训练过程的各种回执数据展示出来,包括标量(scalars),图片(images),音频(Audio),计算图(graph),数据分布,直方图(histograms)和嵌入式向量。、。通过网页来观察模型的结构和训练过程中各个参数的变化。TensorBoard 是日志展示系统,需要在 session 中运算图时,将各种类型的数据汇总并输出到日志文件中。然后启动 TensorBoard 服务,TensorBoard读取这些日志文件,并开启 6060 端口提供 Web 服务,让用户可以在浏览器中查看数据。
tf.summary有诸多函数:
1、tf.summary.scalar
用来显示标量信息,其格式为:
tf.summary.scalar(tags, values, collections=None, name=None)
例如:tf.summary.scalar('mean', mean)
一般在画loss,accuary时会用到这个函数。
2、tf.summary.histogram
用来显示直方图信息,其格式为:
tf.summary.histogram(tags, values, collections=None, name=None)
例如: tf.summary.histogram('histogram', var)
一般用来显示训练过程中变量的分布情况
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=Non
6、tf.summary.audio
展示训练过程中记录的音频
7、tf.summary.merge_all
merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
格式:tf.summaries.merge_all(key='summaries')
8、tf.summary.FileWriter
指定一个文件用来保存图。
格式:tf.summary.FileWritter(path,sess.graph)
可以调用其add_summary()方法将训练过程数据保存在filewriter指定的文件中
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曲线了。
另外,如果我不想保存所有定义的summary信息,也可以用tf.summary.merge方法有选择性地保存信息:
9、tf.summary.merge
格式: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并重复上述过程。
。
10、summary_writer.add_summary
add_summary仅仅是向FileWriter对象的缓存中存放event data。而向disk上写数据是由FileWrite对象控制的。
用例:
add_summary(train_summary,step)
其中train_summary为merge_summary会话生成
使用的时候需要注意的地方:
1、 如果使用filewriter.add_summary(summary, global_step)时没有传global_step参数,会使scarlar_summary变成一条直线。
2、只要是在计算图上的Summary op,都会被merge_all捕捉到,不需要考虑变量生存空间问题!
3、如果执行一次,disk上没有保存Summary数据的话,可以尝试下filewriter.flush()
、
下面为线性回归的一个例子
1 import tensorflow as tf
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 plotdata={"batchsize":[],"loss":[]}
6 def moving_average(a,w=10):
7 if len(a)<w:
8 return a[:]#返回a数值
9 return [val if idx<w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
10 #a为某个列表,如果下标小于10返回数值列表,否则返回10个最近的列表元素和
11
12 train_X=np.linspace(-1,1,100)#
13 print(train_X.shape)#打印的是元组
14 print(*train_X.shape)#打印的是整型
15 print(train_X.shape[0])#打印的是整型
16 train_Y=2*train_X+np.random.randn(*train_X.shape)*0.3 #y=2x加上噪声
17
18 #plt.plot(train_X,train_Y,'ro',label='Original data')
19 #plt.legend()
20 #plt.show()
21
22 X=tf.placeholder("float")
23 Y=tf.placeholder("float")#需要输入的数据使用placeholder占位
24 W=tf.Variable(tf.random_normal([1]),name="weight")
25 b=tf.Variable(tf.zeros([1],name="bias"))#需要求取的变量使用variable
26
27 z = tf.multiply(X, W)+ b#X与W各元素互相相乘与矩阵乘不同
28 tf.summary.histogram('z',z)#1、直方图
29
30 cost=tf.reduce_mean(tf.square(Y-z))
31 tf.summary.scalar('loss_function',cost)#2、对标量数据汇总和记录使用
32 learning_rate=0.01
33
34 opimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
35
36 init=tf.global_variables_initializer()#初始化所有变量
37
38 training_epochs=20
39 display_step=2
40
41 with tf.Session() as sess:
42 sess.run(init)
43 merged_summary_op=tf.summary.merge_all()#3、合并默认图形中的所有汇总
44 summary_writer=tf.summary.FileWriter('log/mnist_with_summaries',sess.graph)#4、写入路径
45
46 for epoch in range(training_epochs):
47 for(x,y) in zip(train_X,train_Y):
48 sess.run(opimizer,feed_dict={X:x,Y:y})
49 summary_str=sess.run(merged_summary_op,feed_dict={X:x,Y:y})#5、会话merged_summary
50 summary_writer.add_summary(summary_str,epoch)#6、将summary_str会话结果写入缓存,实际写入硬盘还是由FileWriter控制
51
52 if epoch%display_step==0:
53 loss=sess.run(cost,feed_dict={X:train_X,Y:train_Y})
54 print("Epoch:",epoch+1,"cost=",loss,"W=",sess.run(W),"b=",sess.run(b))
55 if not(loss=="NA"):
56 plotdata["batchsize"].append(epoch)
57 plotdata["loss"].append(loss)
58
59 print("Finished")
60 print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=",sess.run(W), "b=", sess.run(b))
61 print ("cost:",cost.eval({X: train_X, Y: train_Y}))
62
63 plt.plot(train_X, train_Y, 'ro', label='Original data')
64 plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
65 plt.legend()
66 plt.show()
67 plotdata["avgloss"] = moving_average(plotdata["loss"])
68 plt.figure(1)
69 plt.subplot(211)
70 plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'b--')
71 plt.xlabel('Minibatch number')
72 plt.ylabel('Loss')
73 plt.title('Minibatch run vs. Training loss')
74 plt.show()
75 print("x=0.2,z=", sess.run(z, feed_dict={X: 0.2}))
运行代码,同时启动tensorboard:
在端口6007里打开浏览器,可以查看代价函数数值变化情况等图示