TensorFlow框架(2)之TensorBoard详解

   为了更方便 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

4. 参考文献

posted @ 2017-08-28 21:29  xiuneng  阅读(2787)  评论(2编辑  收藏  举报