TensorFlow学习系列之九:如何利用可视化数据流图TensorBoard?

一、背景

人们在训练庞大而复杂的深度神经网络时,经常会出现难以理解的运算。而人类是有“视觉青睐”的,也就是说,人们通常对图片带来的信息更善于理解。为了迎合这一特性,也为了更方便理解、调试与优化程序,TensorFlow提供一个非常好用的可视化工具——TensorBoard,它能够可视化机器学习的流程,绘制图像生成的定量指标图以及附加数据。

下面我们就以范例【11-1】这个简单的程序,来说明如何利用TensorBoard。首先,我们要让TensorFlow把运行时的数据快照写到磁盘,以方便在TensorBoard读取,这时我们需要利用一个Python类,叫FileWriter,它是summary的子类。改写【范例11-1】,添加有关可视化的语句,如【范例11-2】所示。

二、范例

【范例11-2】将数据流数据写入磁盘(TensorBoard.py)
import tensorflow as tf

a = tf.constant(4, name = "input_a")

b = tf.constant(2, name = "input_b")
c = tf.multiply(a,b, name ="mul_c")
d = tf.add(a,b, name = "add_d")
e = tf.add(c,d, name = "add_e")

with tf.Session() as sess: 
	print(sess.run(e))
	writer = tf.summary.FileWriter('./my_graph/1')
	writer.add_graph(sess.graph)

三、范例解析

相比于【范例11-1】,本例添加了第11~12行代码。第11行代码的功能设置数据流图数据的写入路径“./my_graph/1”(当然,这个目录并非是固定的,读者需要根据自己的图日志数据存储而做相应的调整,)。第12行代码将当前会话的图数据,写入指定路径下的文件中(文件名读者无需关心,TensorFlow有自己的一套文件命名方式)。

按“Shift +Enter”组合键,在Jupyter中运行这个程序,可以发现,程序的运行结果并没有发生任何改变,依然是“14”,但有关图运行的事件日志数据已经被写入到指定路径。


yhilly@ubuntu:~/tf-notebooks$  pwd            #查看当前工作目录
/home/yhilly/tf-notebooks
yhilly@ubuntu:~/tf-notebooks$ ls  my_graph/1/  #显示指定目录的文件
events.out.tfevents.1511860910.ubuntu
通过“ls”命令,可以显示指定目录的文件,其中以“events”开始的文件events.out.tfevents.1511860910.ubuntu,就是所谓的事件日志数据。如果我们想一探究竟,还可以用vim编辑器打开它,如图11-28所示。
TensorFlow学习系列之九:如何利用可视化数据流图TensorBoard?_第1张图片
图11-28  TensorFlow生成的图数据

或许你会疑惑,这个文件内容有点看不明白啊。是的,这些内容都是使用Protocol Buffer协议序列化之后的数据,它的设计目的并不是让“人”来懂的,懂它的是TensorBoard,它可以帮助我们总结(summary)出来要义。下面我们就调用TensorBoard来解析它。在终端命令行模式下输入如下指令:


yhilly@ubuntu:~/tf-notebooks$ tensorboard --logdir=./my_graph/1
TensorBoard 1.7.0 at http://ubuntu:6006 (Press CTRL+C to quit)

从TensorBoard的启动参数选项“--logdir”可知,其后跟随的参数就是tf.summary.FileWriter写入事件日志文件的目录路径。请注意,这里指定的是日志文件(Event Files)所在的“目录”,而非具体的“日志文件”。

这是因为,TensorBoard在加载日志文件时,会把日志目录下的所有事件文件,全部读取出来,一并分析。这样做是有原因的,因为深度学习项目在训练过程中,会因各式各样的错误终止,而后又重新执行,这样每次都会生成一个事件文件,一并读取出来的好处在于,有参照对比的功效。这就好比,人们在看病时,为了准确诊断病情,医生还希望看到以前的诊断记录。


实际上,除了前面讲到参数“--logdir”之外,TensorBoard还有其他启动参数,下面一并给予简单介绍。

--port 				设置Web服务端口号,如果不设置,默认值是6006
--event_file			指定一个特定的事件日志文件
--reload_interval		Web服务后台重新加载数据的间隔,默认值为120秒

从TensorBoard启动后显示的提示信息可知,由于我们并没有手动设置服务端口号,TensorBoard会在后台自动开启了一个端口号为6066的Web服务。该服务进程能从事件日志文件中,读取必要的数据流图的概要(Summary)信息,然后将这些信息绘制成能在网页显示的图片。

在浏览器地址栏中,输入http://ubuntu:6006,即可访问这个服务。实际上,这个“ubuntu”仅是笔者localhost(本机)的主机名,所以在浏览器地址栏中输入http://localhost:6006,二者的效果是一样的。读者应根据TensorBoard的提示信息,灵活调整在地址栏的输入链接地址。

【范例11-2】的数据流程图(部分)如图11-29所示。我们可以用鼠标拖动这个图的显示区域,还可以利用鼠标滑轮放大或缩小该图。
TensorFlow学习系列之九:如何利用可视化数据流图TensorBoard?_第2张图片
图11-29  TensorBoard显示的数据流程图
如果想终止TensorBoard的服务,可在开启这个服务的终端窗口,同时按下组合键“CTRL+C”,来终止它。请注意,这里的“C”表示的是“Cancel(取消)”,而非我们常用的“Copy(复制)”。
事实上,除了前面介绍的生成上述计算结构图(使用tf.summary.FileWriter),还可生成如下四类概要数据,分别简介如下:
(1)标量数据,如代价损失值、准确率等,这时需要使用tf.summary.scalar算子。
(2)参数数据,参数矩阵(weights)、偏置(bias)矩阵等,可使用tf.summary.histogram直方图算子。
(3)音频数据,使用tf.summary.audio算子。

(4)图像数据,使用tf.summary.image算子。

所有这些记录摘要算子,因为它们没有被其他计算节点所依赖,所以不会自动触发执行。因此,想运行它们,必需手动在Session.run()中主动触发。

节选自 张玉宏《深度学习之美》部分章节,电子工业出版社,博文视点,2018年6月出版

To be continued~~~

你可能感兴趣的:(深度学习,TensorFlow,TensorFlow学习笔记)