TensorBoard:图形可视化
TensorFlow计算图是强大但复杂的。图形可视化可以帮助您了解和调试它们。这是工作中可视化的一个例子。
TensorFlow图的可视化。
要查看自己的图形,请运行TensorBoard将其指向作业的日志目录,单击顶部窗格上的图表选项卡,然后使用左上角的菜单选择适当的运行。有关如何运行TensorBoard的深入信息,并确保您记录了所有必要的信息,请参阅TensorBoard:可视化学习。
名称范围和节点
典型的TensorFlow图可以拥有成千上万个节点 - 太多,无法轻松查看,甚至可以使用标准图形工具进行布局。为了简化,变量名称可以被限定,并且可视化使用该信息来定义图中节点上的层次结构。默认情况下,仅显示此层次结构的顶部。下面是一个示例,它定义了hidden
名称范围内的 三个操作 tf.name_scope
:
import tensorflow as tf
with tf.name_scope('hidden') as scope:
a = tf.constant(5, name='alpha')
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
b = tf.Variable(tf.zeros([1]), name='biases')
这导致以下三个操作名称:
hidden/alpha
hidden/weights
hidden/biases
默认情况下,可视化将三个全部折叠成标记的节点hidden
。额外的细节不会丢失。您可以双击,或者点击橙色+
右上角号展开节点,然后你会看到三个子节点alpha
,weights
和biases
。
这是一个现实生活中的一个更复杂的节点在其初始和扩展状态的例子。
*名称范围的初始视图pool_1 。单击+ 右上角的橙色按钮或双击节点本身将会扩展它。
|
展开pool_1 名称范围视图。单击- 右上角的橙色按钮或双击节点本身将折叠名称范围。
|
按名称范围分组节点对于制作清晰的图表至关重要。如果您正在构建模型,则名称范围可以控制生成的可视化。 你的名字范围越好,你的可视化就越好。
上图显示了可视化的第二个方面。TensorFlow图有两种连接:数据依赖和控制依赖。数据相关性显示两个操作之间的张量流,并显示为实线箭头,而控制依赖使用虚线。在扩展视图(上图右侧),所有连接都是数据依赖关系,但虚线连接CheckNumerics
和control_dependency
。
有一个简单的布局的第二个技巧。大多数TensorFlow图具有与其他节点的许多连接的几个节点。例如,许多节点可能对初始化步骤具有控制依赖性。绘制init
节点及其依赖关系之间的所有边缘将创建一个非常混乱的视图。
为了减少杂乱,可视化将所有高度节点分离到右侧的 辅助区域,并且不绘制线条来表示其边缘。而不是线,我们绘制小节点图标来指示连接。分离辅助节点通常不会消除关键信息,因为这些节点通常与记账功能相关。有关如何在主图和辅助区之间移动节点,请参阅交互。
节点conv_1 已连接save 。注意save 右侧的小节点图标。
|
save 具有较高的程度,并将作为辅助节点出现。连接conv_1 在左侧显示为节点图标。为了进一步减少杂乱,因为save 有很多连接,我们显示前5个,并将其他的缩写为。 .
|
最后一个结构简化是系列崩溃。顺序图案 - 也就是说,名称与最后一个数字相同并具有同构结构的节点被折叠成单个节点堆叠,如下所示。对于具有长序列的网络,这大大简化了视图。与分层节点一样,双击展开该系列。请参阅 交互如何禁用/启用特定节点集合的系列折叠。
节点序列的折叠视图。 | 一小块展开后的视图,双击后。 |
最后,作为可读性的最后一个帮助,可视化使用常量和汇总节点的特殊图标。总而言之,下面是一个节点符号表:
符号 | 含义 |
---|---|
表示名称范围的高级节点。双击以展开高级节点。 | |
没有相互连接的编号节点序列。 | |
编号节点的顺序相互连接。 | |
单个操作节点。 | |
一个常数。 | |
摘要节点。 | |
边缘显示操作之间的数据流。 | |
边界显示操作之间的控制依赖关系。 | |
一个参考边,表示输出操作节点可以使输入的张量变异。 |
相互作用
通过平移和缩放来浏览图形。单击并拖动以平移,并使用滚动手势进行缩放。双击某个节点,或单击其+
按钮,展开一个表示一组操作的名称范围。为了轻松跟踪缩放和平移时的当前视点,右下角有一个小地图。
要关闭打开的节点,请再次双击或单击其-
按钮。您也可以单击一次以选择一个节点。它将变得更暗的颜色,关于它的细节和它连接的节点将出现在可视化的右上角的信息卡中。
信息卡显示conv2 名称范围的详细信息。输入和输出从名称范围内的操作节点的输入和输出组合。对于名称范围,不显示任何属性。
|
信息卡显示DecodeRaw 操作节点的详细信息。除了输入和输出之外,卡还显示了与当前操作相关的设备和属性。
|
TensorBoard提供了几种改变图形视觉布局的方法。这不会改变图形的计算语义,但它可以为网络的结构带来一些清晰度。通过右键单击节点或按下该节点信息卡底部的按钮,可以对其布局进行以下更改:
- 节点可以在主图和辅助区之间移动。
- 可以取消分组的一系列节点,使得该系列节点不会出现分组在一起。未分组的系列也可以重新组合。
选择也有助于理解高度节点。选择任何高度节点,并选择其他连接的相应节点图标。这样可以很容易地看出哪些节点被保存,哪些不是。
单击信息卡中的节点名称将会选择它。如果需要,视点将自动平移,以便节点可见。
最后,您可以使用图例上方的颜色菜单为图形选择两种配色方案。默认的结构视图显示结构:当两个高级节点具有相同的结构时,它们以彩虹的相同颜色显示。独特结构的节点是灰色的。有一个第二个视图,显示不同操作运行的设备。名称范围与其中的操作的设备的分数成比例着色。
下面的图像给出了一张现实生活中的图形的图示。
结构视图:灰色节点具有独特的结构。橙色conv1 和conv2 节点具有相同的结构,类似于具有其他颜色的节点。
|
设备视图:名称范围与其中的操作节点的设备的分数成正比。这里,紫色表示GPU,绿色是CPU。 |
张量形状信息
当序列化GraphDef
包括张量形状时,图形可视化器用张量尺寸标注边缘,边缘厚度反映总张量大小。GraphDef
将实际图形对象(如同sess.graph
)中的张量形状包含FileWriter
在序列化图形时。下图显示了具有张量形状信息的CIFAR-10模型:
具有张量形状信息的CIFAR-10模型。 |
运行时统计信息
通常,为运行收集运行时元数据,例如总内存使用量,总计算时间和节点的张量形状,这是很有用的。下面的代码示例是来自列车和测试部分的简单MNIST教程的修改的 片段,其中我们记录了摘要和运行时统计信息。有关 如何记录摘要的详细信息,请参阅摘要教程。全部来源在这里。
# Train the model, and also write summaries.
# Every 10th step, measure test-set accuracy, and write test summaries
# All other steps, run train_step on training data, & add training summaries
def feed_dict(train):
"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
if train or FLAGS.fake_data:
xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
k = FLAGS.dropout
else:
xs, ys = mnist.test.images, mnist.test.labels
k = 1.0
return {x: xs, y_: ys, keep_prob: k}
for i in range(FLAGS.max_steps):
if i % 10 == 0: # Record summaries and test-set accuracy
summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
test_writer.add_summary(summary, i)
print('Accuracy at step %s: %s' % (i, acc))
else: # Record train set summaries, and train
if i % 100 == 99: # Record execution stats
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
summary, _ = sess.run([merged, train_step],
feed_dict=feed_dict(True),
options=run_options,
run_metadata=run_metadata)
train_writer.add_run_metadata(run_metadata, 'step%d' % i)
train_writer.add_summary(summary, i)
print('Adding run metadata for', i)
else: # Record a summary
summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
train_writer.add_summary(summary, i)
此代码将从步骤99开始每100步执行统计。
当您启动张量板并转到“图表”选项卡时,您将看到“会话运行”下的选项,这些选项对应于添加运行元数据的步骤。选择其中一个运行将在该步骤显示网络的快照,淡化未使用的节点。在左侧的控件中,您可以通过总内存或总计算时间对节点进行着色。另外,单击节点将显示精确的总内存,计算时间和张量输出大小。