为了更方便 TensorFlow 程序的理解、调试与优化,TensorFlow发布了一套叫做 TensorBoard 的可视化工具。你可以用 TensorBoard 来展现你的 TensorFlow 图像,绘制图像生成的定量指标图以及附加数据。
TensorBoard工具通过读取TensorFlow产生的事件(events)文件来进行图像绘制,其中这个事件文件是在运行TensorFlow时产生的summary数据。简单地说,可以将TensorBoard的使用分为两步:数据序列化和启动TensorBoard。
1. Quick Start
1.1 序列化
数据序列化就是将summary节点保存为TensorFlow的事件文件,即保存TensorFlow中产生的summary数据。保存TensorFlow事件文件通过调用tf.summary.FileWriter函数来实现。如下所示是一个程序的简单序列化。
from __future__ import print_function import tensorflow as tf
session = tf.Session()
w = tf.Variable([.3], tf.float32,name="w") b = tf.Variable([-.3], tf.float32,name="b") x = tf.placeholder(tf.float32,name="x")
linear = w * x + b
train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph) init = tf.global_variables_initializer() session.run(init) print(session.run(linear, {x: [1, 2, 3, 4]})) |
当执行上述程序后,在'/tmp/mnist_logs'目录下会生成一个文件。
PS:
tf.summary.FileWriter函数必须在global_variables_initializer().run()函数之前调用,在重命名tensor对象之后调用。
1.2 启动
当对TensorFlow的计算图进行序列化为文件后,即可启动TensorBoard工具绘制图像。启动TensorBoard的方式也非常简单,只需在控制终端上执行"TensorBoard"命令,同时传递序列化文件的路径。如绘制上述程序的序列化文件,则可执行如下命令:
tensorboard --logdir=/tmp/mnist_logs |
启动TensorBoard后,用户在浏览器中输入:http://localhost:6006/,即可查看已绘制的TensorFlow图像,在"GRAPHS"标签能够查看TensorFlow计算流图,如图 11所示。
图 11
2. Summary Data
2.1 Operation
如上所述,TensorBoard工具通过读取TensorFlow产生的事件(events)文件来进行图像绘制,而事件文件是在运行TensorFlow时产生的summary数据。这里的summary数据是由TensorBoard提供的Summary Operation生成的。
如表 11所示,能够生成Summary Data的Operation有四个:
表 11 summary operation
Operation | 语义 |
tf.summary.scalar | 产生标量(scalars)类型的summary data |
tf.summary.histogram | 产生直方图(histograms)类型的summary data |
tf.summary.image | 产生图片(images)类型的summary data |
tf.summary.audio | 产生音频(Audio)类型的summary data |
PS:
上述四个函数分别产生的summary data会在TensorBoard图形中的相应标签中,如图 11所示的SCALARS、IMAGES、AUDIO和HISTOGRAMS,而GRAPHS是自动产生的。
2.2 Tensor
其实表 11中Operation生成的Summary Data也是一种Tensor对象,所以若没有使用Session的run方法执行它们,这些Tensor是不会产生任何Summary Data的。因此为了生成Summary Data,需要用户手动一个个生成,然而这种方法太过麻烦。所以TensorFlow提供一个将所有Summary Operation生成的Tensor集成为一个Tensor对象,用户只需通过Session.run函数执行这个Tensor对象,即可生成所有的Summary Data。该函数为:tf.summary.merge_all()。
在执行这个集成Tensor对象后,会生成一个Summary protobuf对象,用户需要将这个对象传递给tf.summary.filewriter对象,这样所有Summary data就会序列化到事件文件中。
如下示例是将tf.summary.scalar操作生成的Summary Data序列化为事件文件:
import numpy as np import tensorflow as tf #Model parameters w = tf.Variable([.3], tf.float32) b = tf.Variable([-.3], tf.float32) #Model input and output x = tf.placeholder(tf.float32) linear_model = w * x + b y = tf.placeholder(tf.float32)
#loss squared_deltas = tf.square(linear_model - y) loss = tf.reduce_sum(squared_deltas) #optimizer optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss) #1.保存需要序列化的常量 tf.summary.scalar('loss', loss) with tf.name_scope('constant'): c = tf.constant(4.3,tf.float32) tf.summary.scalar('c', c)
#training loop init = tf.global_variables_initializer() session = tf.Session() #2.集成所有Summary Operation merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph) session.run(init) for i in range(1000): session.run(train, {x:[1,2,3,4], y:[0, -1, -2, -3]}) #3.执行集成的operation summary = session.run(merged, {x:[1,2,3,4], y:[0, -1, -2, -3]}) #4.序列化到事件文件中 train_writer.add_summary(summary,i)
#evaluate training accuracy curr_w, curr_b, curr_loss = session.run([w,b,loss], {x:[1, 2, 3, 4], y:[0, -1, -2, -3]}) print("w:%s b:%s loss:%s"%(curr_w,curr_b,curr_loss)) |
图 12
3. 命名空间
典型的 TensorFlow 可以有数以千计的节点,如此多而难以一下全部看到,甚至无法使用标准图表工具来展示。为简单起见,TensorFlow提供一个将多个变量名划定范围的函数,并且可视化把该信息用于在图表中的节点上定义一个层级。该函数为:with tf.name_scope。默认情况下,只有顶层节点会显示。
如下示例将x和w划定为hidden范围的命名空间内:
import tensorflow as tf
session = tf.Session()
b = tf.Variable([-.3], tf.float32,name="b") with tf.name_scope('hidden'): x = tf.placeholder(tf.float32,name="x") w = tf.Variable([.3], tf.float32,name="w")
linear = w * x + b
train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph) init = tf.global_variables_initializer() session.run(init) print(session.run(linear, {x: [1, 2, 3, 4]})) |
图 21