TensorBoard教程:TensorFlow图可视化

⚡ 智能摘要

TensorBoard 是 TensorFlow 训练运行的可视化前端,用于绘制损失曲线、模型图、权重直方图和嵌入向量。本教程将使用估计器写入事件文件,然后在 6006 端口打开仪表板。

  • 🔘 五个仪表盘: 标量、图形、分布、直方图和投影仪分别读取不同的摘要类型。
  • ☑️ 日志目录: model_dir 参数决定 TensorFlow 将 events.out.tfevents 文件写入的位置。
  • ✅ 启动命令: 运行 tensorboard –logdir=PATH,然后在任何浏览器中打开 http://localhost:6006。
  • 🧪 学习率: 锯齿状的损失曲线表明模型收敛速度过快。
  • 🛠️ TensorFlow 2: Keras TensorBoard 回调函数取代了原始示例中显示的估计器日志记录。
  • ⚠️ 故障排除: 仪表盘为空几乎总是意味着日志目录路径与训练运行不匹配。

TensorBoard教程:TensorFlow图可视化

什么是 TensorBoard?

TensorBoard 是一个用于可视化图形和其他工具的界面,用于理解、调试和优化模型。它为机器学习工作流程提供测量和可视化功能。 track 个指标(如损失和准确率),可视化模型图,并将嵌入投影到低维空间。

TensorBoard 附带 TensorFlow 它作为小型本地 Web 服务器运行,读取训练作业写入磁盘的事件文件。

使用 TensorBoard 进行 TensorFlow 图可视化的示例

下图来自您将在本教程中生成的 TensorBoard 图。它是主面板:

TensorBoard Scalars 控制面板显示了训练好的 DNN 回归器的平均损失曲线

从下图中可以看到 TensorBoard 图形可视化的面板。面板包含不同的选项卡,这些选项卡与您在运行模型时添加的信息级别相关联。

TensorBoard导航栏包含标量、图形、分布、直方图和投影仪选项卡

  • 标量: 在模型训练过程中显示不同的有用信息
  • 图表: 展示模型
  • 直方图: 用直方图显示权重
  • 分布: 显示重量分布
  • 投影仪: 展示主成分分析和T-SNE算法。这是用于降维的技术。

在本TensorBoard教程中,您将训练一个简单的模型。 深入学习 该模型生成的图表是从下往上读取的。

通过观察图表,您可以了解该模型的工作原理。下图截图中的编号标记代表了这四个阶段:

  1. 将数据入队到模型:将与批次大小相等的数据量推送到模型,即每次迭代后的数据馈送数量
  2. 将数据提供给张量
  3. 训练模型
  4. 显示训练过程中的批次数。将模型保存在磁盘上。

TensorBoard 中的 TensorFlow 图,其中节点编号分别代表输入队列、DNN 模块和保存操作。

TensorBoard 的基本理念是,神经网络就像一个黑盒子,你需要一个工具来检查盒子内部的情况。你可以把 TensorBoard 想象成一个手电筒,用来深入研究神经网络。

它有助于理解操作之间的依赖关系、权重的计算方式、显示损失函数和许多其他有用信息。当你将所有这些信息整合在一起时,你就有了一个很棒的工具来调试和找到如何改进模型的方法。

为了让您了解 TensorBoard 图的实用性,请看下面的两条损失曲线:

并排展示两条TensorBoard损失曲线,对比一个无法学习的模型和一个能够收敛的模型。

神经网络决定如何连接不同的神经元以及模型预测结果所需的层数。一旦架构确定,不仅需要训练模型,还需要训练一个衡量预测准确性的指标。这个指标称为损失函数,目标是最小化它,这意味着模型犯的错误越少越好。

每个训练算法都会重复计算多次,直到损失曲线趋于平缓。最小化损失还需要一个学习率,它决定了模型学习的速度。如果学习率设置得太高,模型就来不及学习任何东西:这就是左侧图表的情况,曲线上下波动,因为模型实际上是在猜测。右侧图表显示损失随着迭代次数的增加而降低,直到曲线趋于平缓,这意味着模型已经找到了解决方案。

TensorBoard 是一个强大的工具,可以可视化这些指标并突出显示潜在问题。神经网络可能需要数小时甚至数周才能找到解决方案,而 TensorBoard 会在任务仍在运行时刷新指标。因此,您无需等到训练结束才能查看模型是否训练正确:打开 TensorBoard,检查训练进度,并在必要时进行相应的更改。

如何使用TensorBoard?

在本节中,您将学习如何从终端打开 TensorBoard。 macOS 以及从命令行…… Windows这里的重点是工具而不是模型,因此训练代码特意保持简短。

首先,您需要导入训练过程中将要使用的库。

## Import the library
import tensorflow as tf
import numpy as np

您创建了数据。它是一个包含 10000 行和 5 列的数组。

X_train = (np.random.sample((10000,5)))
y_train =  (np.random.sample((10000,1)))
X_train.shape

输出

(10000, 5)

以下代码用于转换数据并创建模型。

请注意,学习率的值为 0.1。如果将此值调高,模型将找不到解决方案。上图左侧的情况就是如此。

该示例使用 TensorFlow 估算器,这是一个封装了数学计算的高级 API。估算器属于 TensorFlow 1.x API,因此以下两个代码片段可以在 1.x 安装下运行,或者通过以下方式运行: tf.compat.v1 命名空间。

要创建日志文件,您需要指定路径。这可以通过参数来完成。 model_dir.

在下面的 TensorBoard 示例中,您将模型存储在工作目录中,即存储 notebook 的目录。 Python 文件。在此路径下,TensorFlow 将创建一个名为 train 的文件夹,其中包含一个名为 linreg 的子文件夹。

feature_columns = [
      tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]
DNN_reg = tf.estimator.DNNRegressor(feature_columns=feature_columns,
# Indicate where to store the log file    
     model_dir='train/linreg',    
     hidden_units=[500, 300],    
     optimizer=tf.train.ProximalAdagradOptimizer(      
          learning_rate=0.1,      
          l1_regularization_strength=0.001    
      )
)

输出

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {&#x27;_model_dir': 'train/linreg', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1818e63828>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

此 TensorFlow 可视化图示例的最后一步是训练模型。在训练过程中,TensorFlow 会将信息写入模型目录。

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(    
     x={"x": X_train},    
     y=y_train, shuffle=False,num_epochs=None)
DNN_reg.train(train_input,steps=3000)

输出

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train/linreg/model.ckpt.
INFO:tensorflow:loss = 40.060104, step = 1
INFO:tensorflow:global_step/sec: 197.061
INFO:tensorflow:loss = 10.62989, step = 101 (0.508 sec)
INFO:tensorflow:global_step/sec: 172.487
INFO:tensorflow:loss = 11.255318, step = 201 (0.584 sec)
INFO:tensorflow:global_step/sec: 193.295
INFO:tensorflow:loss = 10.604872, step = 301 (0.513 sec)
INFO:tensorflow:global_step/sec: 175.378
INFO:tensorflow:loss = 10.090343, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 209.737
INFO:tensorflow:loss = 10.057928, step = 501 (0.476 sec)
INFO:tensorflow:global_step/sec: 171.646
INFO:tensorflow:loss = 10.460144, step = 601 (0.583 sec)
INFO:tensorflow:global_step/sec: 192.269
INFO:tensorflow:loss = 10.529617, step = 701 (0.519 sec)
INFO:tensorflow:global_step/sec: 198.264
INFO:tensorflow:loss = 9.100082, step = 801 (0.504 sec)
INFO:tensorflow:global_step/sec: 226.842
INFO:tensorflow:loss = 10.485607, step = 901 (0.441 sec)
INFO:tensorflow:global_step/sec: 152.929
INFO:tensorflow:loss = 10.052481, step = 1001 (0.655 sec)
INFO:tensorflow:global_step/sec: 166.745
INFO:tensorflow:loss = 11.320213, step = 1101 (0.600 sec)
INFO:tensorflow:global_step/sec: 161.854
INFO:tensorflow:loss = 9.603306, step = 1201 (0.619 sec)
INFO:tensorflow:global_step/sec: 179.074
INFO:tensorflow:loss = 11.110269, step = 1301 (0.556 sec)
INFO:tensorflow:global_step/sec: 202.776
INFO:tensorflow:loss = 11.929443, step = 1401 (0.494 sec)
INFO:tensorflow:global_step/sec: 144.161
INFO:tensorflow:loss = 11.951693, step = 1501 (0.694 sec)
INFO:tensorflow:global_step/sec: 154.144
INFO:tensorflow:loss = 8.620987, step = 1601 (0.649 sec)
INFO:tensorflow:global_step/sec: 151.094
INFO:tensorflow:loss = 10.666125, step = 1701 (0.663 sec)
INFO:tensorflow:global_step/sec: 193.644
INFO:tensorflow:loss = 11.0349865, step = 1801 (0.516 sec)
INFO:tensorflow:global_step/sec: 189.707
INFO:tensorflow:loss = 9.860596, step = 1901 (0.526 sec)
INFO:tensorflow:global_step/sec: 176.423
INFO:tensorflow:loss = 10.695, step = 2001 (0.567 sec)
INFO:tensorflow:global_step/sec: 213.066
INFO:tensorflow:loss = 10.426752, step = 2101 (0.471 sec)
INFO:tensorflow:global_step/sec: 220.975
INFO:tensorflow:loss = 10.594796, step = 2201 (0.452 sec)
INFO:tensorflow:global_step/sec: 219.289
INFO:tensorflow:loss = 10.4212265, step = 2301 (0.456 sec)
INFO:tensorflow:global_step/sec: 215.123
INFO:tensorflow:loss = 9.668612, step = 2401 (0.465 sec)
INFO:tensorflow:global_step/sec: 175.65
INFO:tensorflow:loss = 10.009649, step = 2501 (0.569 sec)
INFO:tensorflow:global_step/sec: 206.962
INFO:tensorflow:loss = 10.477722, step = 2601 (0.483 sec)
INFO:tensorflow:global_step/sec: 229.627
INFO:tensorflow:loss = 9.877638, step = 2701 (0.435 sec)
INFO:tensorflow:global_step/sec: 195.792
INFO:tensorflow:loss = 10.274586, step = 2801 (0.512 sec)
INFO:tensorflow:global_step/sec: 176.803
INFO:tensorflow:loss = 10.061047, step = 2901 (0.566 sec)
INFO:tensorflow:Saving checkpoints for 3000 into train/linreg/model.ckpt.
INFO:tensorflow:Loss for final step: 10.73032.

<tensorflow.python.estimator.canned.dnn.DNNRegressor at 0x1818e63630>

在 TensorFlow 2 中,同样的工作由 Keras TensorBoard 回调函数完成,它会写入计算图和每个 epoch 的指标,而无需任何估计器代码:

logdir = "logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model.fit(train_images, train_labels, epochs=5,
          callbacks=[tensorboard_callback])

运行结束后,日志目录中会保存一个检查点文件。 graph.pbtxt 文件和一个或多个 events.out.tfevents 文件——正是 TensorBoard 读取的内容。

对于 macOS 用户

下面这张 Finder 视图显示了在工作目录中创建的新 train/linreg 文件夹。

macOS 文件列表显示了包含检查点、事件和 graph.pbtxt 文件的 train 和 linreg 日志文件夹。

对于 Windows 用户

On Windows 相同的文件会出现在您传递给 model_dir 的路径下,如地址栏中突出显示的那样。

Windows 包含 TensorFlow 事件和检查点文件的训练 linreg 文件夹的资源管理器视图

由以下方式生成相同的事件文件格式: PyTorch因此,该仪表板不仅限于 TensorFlow 运行。

现在日志事件已经写入完毕,您可以打开 TensorBoard 了。TensorBoard 默认运行在 6006 端口上(Jupyter 使用端口 8888)。使用终端 macOS 或者 Anaconda 提示符 Windows.

对于 macOS 用户

# Different for you
cd /Users/Guru99/tuto_TF
source activate hello-tf!

笔记本存储在 /Users/ 路径下。Guru99/tuto_TF

对于 Windows 用户

cd C:\Users\Admin\Anaconda3
activate hello-tf

该笔记本存储在路径 C:\Users\Admin\Anaconda3

要启动 TensorBoard,请从该目录运行以下命令。

对于 macOS 用户

tensorboard --logdir=./train/linreg

对于 Windows 用户

tensorboard --logdir=.\train\linreg

然后,TensorBoard 的服务地址为 http://localhost:6006

旗 它控制什么
--logdir 存放事件文件的目录。这是唯一必需的标志。
--port 要使用的端口。默认值为 6006;如果之前的会话仍然占用该端口,请更改此值。
--bind_all 在所有网络接口上提供服务。TensorBoard 默认仅绑定到本地主机,因此远程访问需要此标志,并且不能与以下选项同时使用: --host.
--reload_interval 日志目录重新扫描新数据的频率(以秒为单位)。
--logdir_spec 旧版回退方案接受多个以逗号分隔的路径; --logdir 不再支持该形式。

此 tensorboard dev 子命令不再有效:托管的 TensorBoard.dev 服务已于 2024 年 1 月 1 日关闭。本地使用不受影响。

在某些机器上,控制台会打印主机名而不是 localhost,如下面的 Anaconda Prompt 所示。两种地址都会打开相同的仪表板。

使用 Anaconda Prompt 运行 tensorboard 命令,并在 6006 端口打印服务器地址

复制并粘贴此地址到您常用的浏览器中。您应该会看到如下所示的 Scalars 控制面板。

日志目录正确加载后,TensorBoard Scalars 控制面板会在浏览器中打开。

如果你看到的是类似这样的内容:

TensorBoard 错误页面显示:未找到图定义文件

这意味着 TensorBoard 找不到日志文件。请确保您已指向该文件。 cd 确认路径是否正确,或者再次确认日志事件是否实际已创建。如果没有创建,请重新运行训练代码。

如果要关闭 TensorBoard,请在终端窗口中按 CTRL+C。

提示:请检查您的 Anaconda prompt 以获取当前工作目录。

Anaconda Prompt 显示活动的 hello-tf 环境和当前工作目录

在上面的截图中,提示符位于 C:\Users\Admin,因此日志文件应该在该文件夹下创建。

常见问题

一次训练运行结束后,会留下一个检查点索引、一个或多个 model.ckpt 文件、一个 graph.pbtxt 文件以及至少一个 events.out.tfevents 文件。TensorBoard 只读取事件文件;检查点的存在是为了方便训练从中断处继续进行。

是的。 PyTorch 船舶摘要Writer 它输出的事件文件格式相同,因此使用相同的 tensorboard --logdir 命令即可渲染仪表板。服务器本身没有任何变化——只有生成摘要的库发生了变化。

不。托管服务已于 2024 年 1 月 1 日关闭,TensorBoard 开发子命令现在会返回错误。要分享结果,请在笔记本(例如 TensorBoard)中运行 TensorBoard。 Google 可以通过 Colab,或者将图表导出为 CSV 或 JSON 格式。

为每次运行创建一个共享父文件夹下的子文件夹,然后使用 `--logdir` 参数指向该父文件夹。每个子文件夹都会在左侧面板中显示为一个单独的运行,并且曲线绘制在同一坐标轴上,每个曲线都带有一个复选框。

操作层图是默认视图,它以自下而上的视角展示了 TensorFlow 如何理解程序。选择 keras 标签会切换到概念图,该图仅显示模型层,更便于与您的设计进行比对。

自动扫描一次可生成数十次运行结果,因此仪表盘不再是单次运行的监控器,而是一个对比工具。HParams 插件会记录每次配置及其指标,方便您对试验进行排序,而无需逐条读取曲线。

GitHub 副驾驶 快速生成回调和摘要编写器的样板代码。请将输出视为草稿:它通常混合使用了 TensorFlow 1.x 和 2.x 的 API,因此在运行代码之前,请务必对照最新文档检查每个名称。

要么没有写入事件文件,要么传递给 `--logdir` 的路径与训练作业使用的路径不匹配。请确认该文件夹中是否存在 `events.out.tfevents` 文件。 Windows 从同一驱动器盘符启动TensorBoard。

总结一下这篇文章: