TensorBoard 是一套 Web 应用程序,用于检查和了解 TensorFlow 运行和图表。
本自述文件概述了 TensorBoard 中的关键概念,以及如何解释 TensorBoard 提供的可视化效果。有关使用 TensorBoard 的深入示例,请参阅教程:TensorBoard:入门。有关如何使用 TensorBoard 处理图像、图形、超参数等的文档以及 Colab 中的教程演练均从此处链接。
TensorBoard 设计为完全离线运行,无需访问互联网。例如,这可能位于您的本地计算机上、公司防火墙后面或数据中心中。
在运行 TensorBoard 之前,请确保您已通过创建摘要编写器在日志目录中生成摘要数据:
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
有关更多详细信息,请参阅 TensorBoard 教程。获得事件文件后,运行 TensorBoard 并提供日志目录。如果您使用预编译的 TensorFlow 包(例如通过 pip 安装),请运行:
tensorboard --logdir path/to/logs
或者,如果您从源代码构建:
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
这应该打印 TensorBoard 已启动。接下来,连接到 http://localhost:6006。
TensorBoard 需要一个logdir
来读取日志。有关配置 TensorBoard 的信息,请运行tensorboard --help
。
TensorBoard 可在 Google Chrome 或 Firefox 中使用。其他浏览器可能可以工作,但可能存在错误或性能问题。
使用 TensorBoard 的第一步是从 TensorFlow 运行中获取数据。为此,您需要摘要操作。摘要操作就是操作,就像tf.matmul
和tf.nn.relu
一样,这意味着它们接受张量、生成张量,并在 TensorFlow 图中进行评估。然而,摘要操作有一个特点:它们生成的张量包含序列化的 protobuf,这些 protobuf 被写入磁盘并发送到 TensorBoard。要在 TensorBoard 中可视化摘要数据,您应该评估摘要操作,检索结果,然后使用 Summary.FileWriter 将该结果写入磁盘。教程中有完整的解释和示例。
支持的摘要操作包括:
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
当你做一个摘要操作时,你也会给它一个tag
。标签基本上是该操作记录的数据的名称,并将用于组织前端中的数据。标量和直方图仪表板按标签组织数据,并根据目录/类似/层次结构将标签分组到文件夹中。如果您有很多标签,我们建议使用斜杠将它们分组。
summary.FileWriters
从 TensorFlow 获取摘要数据,然后将它们写入指定的目录(称为logdir
。具体来说,数据被写入文件名中包含“tfevents”的仅附加记录转储。 TensorBoard 从完整目录中读取数据,并将其组织到单个 TensorFlow 执行的历史记录中。
为什么它读取整个目录,而不是单个文件?您可能一直在使用supervisor.py来运行您的模型,在这种情况下,如果TensorFlow崩溃,supervisor将从检查点重新启动它。当它重新启动时,它将开始写入新的事件文件,TensorBoard 会将各个事件文件拼接在一起,以生成所发生事件的一致历史记录。
您可能想要直观地比较模型的多次执行;例如,假设您更改了超参数并想看看它是否收敛得更快。 TensorBoard 通过不同的“运行”来实现这一点。当 TensorBoard 在启动时传递一个logdir
时,它会递归地遍历以logdir
为根的目录树,查找包含 tfevents 数据的子目录。每次遇到这样的子目录时,它都会将其加载为新的run
,并且前端将相应地组织数据。
例如,这里是一个组织良好的 TensorBoard 日志目录,有两个运行,“run1”和“run2”。
/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments
您还可以传递以逗号分隔的日志目录列表,TensorBoard 将监视每个目录。您还可以通过在名称和路径之间放置冒号来为各个日志目录分配名称,如下所示
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
不鼓励使用该标志( --logdir_spec
),并且通常可以避免使用该标志。 TensorBoard 递归地遍历日志目录;为了更细粒度的控制,更喜欢使用符号链接树。使用--logdir_spec
而不是--logdir
时,某些功能可能不起作用。
TensorBoard 的标量仪表板可视化随时间变化的标量统计数据;例如,您可能想要跟踪模型的损失或学习率。如关键概念中所述,您可以比较多次运行,并且数据按标签组织。折线图具有以下交互作用:
单击每个图表左下角的蓝色小图标将展开图表
拖动图表上的矩形区域将放大
双击图表将缩小
将鼠标悬停在图表上将产生十字准线,数据值记录在左侧的运行选择器中。
此外,您可以通过在仪表板左上角的框中编写正则表达式来创建新文件夹来组织标签。
直方图仪表板显示张量的统计分布如何随时间变化。它可视化通过tf.summary.histogram
记录的数据。每个图表显示数据的时间“切片”,其中每个切片都是给定步骤的张量的直方图。它的组织方式是最旧的时间步在后面,最近的时间步在前面。通过将直方图模式从“偏移”更改为“叠加”,透视图将旋转,以便每个直方图切片都呈现为一条线并相互叠加。
分布仪表板是可视化tf.summary.histogram
直方图数据的另一种方式。它显示了一些关于分布的高级统计数据。图表上的每条线代表数据分布中的一个百分位:例如,底线显示最小值如何随时间变化,中间的线显示中位数如何变化。从上到下阅读,各行具有以下含义: [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
这些百分位数也可以被视为正态分布上的标准差边界: [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
这样,从内到外读取的彩色区域的宽度分别为[σ, 2σ, 3σ]
。
图像仪表板可以显示通过tf.summary.image
保存的 png。仪表板的设置使每一行对应一个不同的标签,每列对应一个运行。由于图像仪表板支持任意 png,因此您可以使用它将自定义可视化(例如 matplotlib 散点图)嵌入到 TensorBoard 中。该仪表板始终向您显示每个标签的最新图像。
音频仪表板可以嵌入可播放的音频小部件,用于通过tf.summary.audio
保存的音频。仪表板的设置使每一行对应一个不同的标签,每列对应一个运行。该仪表板始终嵌入每个标签的最新音频。
Graph Explorer 可以可视化 TensorBoard 图,从而能够检查 TensorFlow 模型。为了充分利用图形可视化工具,您应该使用名称范围对图形中的操作进行分层分组 - 否则,图形可能难以解读。有关更多信息(包括示例),请参阅检查 TensorFlow 图教程。
嵌入投影仪可让您可视化高维数据;例如,您可以在模型将输入数据嵌入到高维空间后查看输入数据。嵌入投影仪从模型检查点文件中读取数据,并且可以配置其他元数据,例如词汇文件或精灵图像。有关更多详细信息,请参阅嵌入投影仪教程。
文本仪表板显示通过tf.summary.text
保存的文本片段。支持包括超链接、列表和表格在内的 Markdown 功能。
时间序列仪表板显示一个统一的界面,其中包含通过tf.summary.scalar
、 tf.summary.image
或tf.summary.histogram
保存的所有标量、直方图和图像。例如,它可以与激活直方图和训练示例图像并排查看“准确性”折线图。
特点包括:
自定义运行颜色:单击运行选择器中的彩色圆圈可更改运行的颜色。
固定卡片:单击任何卡片上的“固定”图标,将其添加到顶部的固定部分以便快速比较。
设置:右侧窗格提供图表和其他可视化效果的设置。当托管在同一 URL 源时,重要设置将在 TensorBoard 会话之间保留。
标签过滤器中的自动完成:更轻松地搜索特定图表。
首先,检查传递给--logdir
目录是否正确。您还可以通过导航到标量仪表板(在“非活动”菜单下)并在左侧边栏底部查找日志目录路径来验证这一点。
如果您从正确的路径加载,请确保事件文件存在。 TensorBoard 将递归地遍历其 logdir,如果数据嵌套在子目录下就可以了。确保以下至少显示一个结果:
find DIRECTORY_PATH | grep tfevents
您还可以通过在检查模式下运行tensorboard来检查事件文件的内容来检查事件文件是否确实具有数据。
tensorboard --inspect --logdir DIRECTORY_PATH
与空白 TensorBoard 对应的事件文件的输出有时仍可能显示几个步骤,代表 TensorBoard 未显示的一些初始事件(例如,当使用 Keras TensorBoard 回调时):
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
相反,具有更多数据的事件文件的输出可能如下所示:
tensor
first_step 0
last_step 55
max_step 250
min_step 0
num_steps 60
outoforder_steps [(2, 0), (2, 0), (2, 0), (2, 0), (50, 9), (100, 19), (150, 29), (200, 39), (250, 49)]
更新: 2.3.0 发布后,TensorBoard 不再每 30 秒自动重新加载一次。要重新启用该行为,请通过单击 TensorBoard Web 界面右上角的齿轮图标打开设置,然后启用“重新加载数据”。
更新:实验性的
--reload_multifile=true
选项现在可用于轮询目录中的所有“活动”文件以获取新数据,而不是如下所述的最新文件。只要文件在--reload_multifile_inactive_secs
秒前收到新数据,该文件就处于“活动”状态,默认为 86400。
出现此问题的原因通常是 TensorBoard 迭代tfevents
文件的方式:它按时间戳顺序遍历事件文件,并且一次仅读取一个文件。假设我们有时间戳为a
和b
文件,其中a 。一旦 TensorBoard 读取了
a
中的所有事件,它就永远不会返回到 a ,因为它假设任何新事件都被写入较新的文件中。例如,如果您有两个FileWriters
同时写入同一目录,这可能会导致问题。如果您有多个摘要编写者,则每个摘要编写者都应写入单独的目录。
更新:实验性的
--reload_multifile=true
选项现在可用于轮询目录中的所有“活动”文件以获取新数据,定义为在--reload_multifile_inactive_secs
秒前接收新数据的任何文件,默认为 86400。
不会。TensorBoard 预计一次只会写入一个事件文件,多个摘要编写器意味着多个事件文件。如果您正在运行分布式 TensorFlow 实例,我们鼓励您指定一个工作人员作为负责所有汇总处理的“首席”。有关示例,请参阅supervisor.py。
如果您看到的数据似乎随着时间的推移而倒退并与自身重叠,则有几种可能的解释。
您可能会多次执行 TensorFlow,并且全部写入同一日志目录。请让每个 TensorFlow 运行写入其自己的日志目录。
更新:实验性的
--reload_multifile=true
选项现在可用于轮询目录中的所有“活动”文件以获取新数据,定义为在--reload_multifile_inactive_secs
秒前接收新数据的任何文件,默认为 86400。
您的代码中可能存在错误,其中 global_step 变量(传递给FileWriter.add_summary
)维护不正确。
您的 TensorFlow 作业可能崩溃了,并从较早的检查点重新启动。请参阅下面的如何处理 TensorFlow 重启。
作为解决方法,请尝试将 TensorBoard 中的 x 轴显示从steps
更改为wall_time
。这通常可以解决问题。
TensorFlow 设计有一种在作业崩溃或被终止时可以正常恢复的机制:TensorFlow 可以定期写入模型检查点文件,这使您能够重新启动 TensorFlow,而不会丢失所有训练进度。
然而,这会让 TensorBoard 的事情变得复杂;想象一下 TensorFlow 在步骤a
写入了一个检查点,然后继续运行直到步骤b
,然后崩溃并在时间戳a
重新启动。 a
和b
之间写入的所有事件都被重新启动事件“孤立”,应将其删除。
为了方便这一点,我们在tensorflow/core/util/event.proto
中有一个SessionLog
消息,它可以将SessionStatus.START
记录为一个事件;与所有事件一样,它可能有一个与之相关的step
。如果 TensorBoard 检测到步骤a
的SessionStatus.START
事件,它将假定步骤大于a
的每个事件都是孤立的,并且它将丢弃这些事件。可以使用标志--purge_orphaned_data false
禁用此行为(在 0.7 之后的版本中)。
Scalar Dashboard支持导出数据;您可以单击左侧栏中的“启用下载链接”选项。然后,每个图将提供其包含的数据的下载链接。
如果您需要访问完整的数据集,您可以使用summary_iterator
方法读取TensorBoard使用的事件文件。
是的!您可以克隆和修改其中一个示例,并制作您自己的令人惊叹的可视化效果。 ADDING_A_PLUGIN 指南中描述了有关插件系统的更多文档。请随意提出功能请求或有关插件功能的问题。
对您自己的突破性新插件感到满意后,请参阅分发部分,了解如何发布到 PyPI 并与社区分享。
使用自定义标量插件,您可以为自定义运行标签对创建带有线条的标量图。但是,在原始标量仪表板中,每个标量图对应于特定标签的数据,并包含包含该标签的每次运行的行。
可以使用自定义标量插件创建裕度图(可视化下限和上限)。原始标量插件不支持可视化边距。
这还不可能。作为解决方法,您可以在自己的代码(例如 matplotlib)中创建自定义绘图,然后将其写入SummaryProto
( core/framework/summary.proto
) 并将其添加到您的FileWriter
。然后,您的自定义绘图将出现在 TensorBoard 图像选项卡中。
TensorBoard 使用水库采样对数据进行下采样,以便将其加载到 RAM 中。您可以使用--samples_per_plugin
命令行参数修改每个标签保留的元素数量(例如: --samples_per_plugin=scalars=500,images=20
)。请参阅此堆栈溢出问题以获取更多信息。
TensorBoard 2.0 之前的 TensorBoard 版本默认在可公开访问的主机0.0.0.0
上提供服务。对于这些版本的 TensorBoard,您可以通过在启动时指定--host localhost
来停止弹出窗口。
在 TensorBoard 2.0 及更高版本中, --host localhost
是默认值。使用--bind_all
恢复在 IPv4 和 IPv6 上为公共网络提供服务的旧行为。
tensorboard
吗?如果您没有安装 TensorFlow,TensorBoard 1.14+ 可以使用缩减的功能集运行。主要限制是,从 1.14 开始,仅支持以下插件:标量、自定义标量、图像、音频、图形、投影仪(部分)、分布、直方图、文本、PR 曲线、网格。此外,Google Cloud Storage 上不支持日志目录。
请参阅 DEVELOPMENT.md。
首先,尝试搜索我们的 GitHub 问题和 Stack Overflow。可能其他人已经遇到了同样的问题或问题。
一般使用问题(或可能特定于您的本地设置的问题)应转到 Stack Overflow。
如果您在 TensorBoard 中发现错误,请提交一个 GitHub 问题,并提供尽可能多的支持信息(例如附加事件文件,包括tensorboard --inspect
的输出等)。