人们在训练庞大而复杂的深度神经网络时,经常会出现难以理解的运算。而人类是有“视觉青睐”的,也就是说,人们通常对图片带来的信息更善于理解。为了迎合这一特性,也为了更方便理解、调试与优化程序,TensorFlow提供一个非常好用的可视化工具——TensorBoard,它能够可视化机器学习的流程,绘制图像生成的定量指标图以及附加数据。
下面我们就以范例【11-1】这个简单的程序,来说明如何利用TensorBoard。首先,我们要让TensorFlow把运行时的数据快照写到磁盘,以方便在TensorBoard读取,这时我们需要利用一个Python类,叫FileWriter,它是summary的子类。改写【范例11-1】,添加有关可视化的语句,如【范例11-2】所示。
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所示。
或许你会疑惑,这个文件内容有点看不明白啊。是的,这些内容都是使用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所示。我们可以用鼠标拖动这个图的显示区域,还可以利用鼠标滑轮放大或缩小该图。(4)图像数据,使用tf.summary.image算子。
所有这些记录摘要算子,因为它们没有被其他计算节点所依赖,所以不会自动触发执行。因此,想运行它们,必需手动在Session.run()中主动触发。
节选自 张玉宏《深度学习之美》部分章节,电子工业出版社,博文视点,2018年6月出版
To be continued~~~