3.6 使用TensorBoard进行监控
如果你曾经尝试过自己训练NN,那你肯定知道这有多么痛苦和不确定。我不是要谈论根据现有的教程和示例来实现,这种情况已经调整好了所有的超参,现在要讨论的是刚获取一些数据并需要从头开始创建一些东西。即便使用已经包含了一些最佳实践(包括权重的合理初始化,优化器的beta、gamma和其他选项均已经设置为默认值,以及隐藏的大量其他东西)的DL高级工具包,仍然需要做很多决定,因此很多事情可能出错。因此,这会导致网络首次运行几乎无法成功,你应该习惯这种情况。
当然,通过实践和经验,你可以对产生问题的可能原因有很强的直觉,但是产生这种直觉需要对有关网络内部发生的情况有更多的了解。因此,需要能够以某种方式观察训练过程以及其变化。即使是小型网络(例如微MNIST教程网络)也可能有成千上万个具有非线性动态的参数。
DL从业人员已制定出在训练期间应观察的事项清单,通常包括以下内容:
- 损失值,通常由基本损失和正则化损失等几部分组成。应该同时观察总损失和各个组成部分。
- 训练和测试数据集的验证结果。
- 梯度和权重的统计信息。
- 网络计算出来的值。例如,如果你正在解决分类问题,肯定要测量所预测的类概率计算出的熵。在回归问题中,原始预测值可以提供有关训练的大量数据。
- 学习率和其他超参(如果它们也是随时间调整的话)。
该清单可能更长,并且包含特定领域的度量标准,例如词嵌入投影、音频样本和GAN生成的图像。你可能还希望监控与训练速度相关的值(例如一个epoch需要多长时间)以查看优化效果或硬件问题。
长话短说,我们需要一个通用的解决方案来追踪一段时间内的大量值,并将它们表示出来进行分析,最好是专门为DL开发的(想象一下在Excel电子表格中查看此类统计信息)。幸运的是,已经存在这样的工具,接下来我们将对其进行探索。
3.6.1 TensorBoard 101
在撰写本书第1版时,用于NN监控的工具还不多。随着时间的流逝,越来越多的新人和公司参与了对机器学习(ML)和DL的研究,出现了很多新工具。在本书中,我们仍然将重点放在TensorFlow中的TensorBoard上,你也可以尝试使用其他实用程序。
TensorFlow从第一个公开版本开始,就包含一个名为TensorBoard的特殊工具,该工具旨在解决上面讨论的问题:如何在训练中观察和分析NN的各种特性。TensorBoard是一个功能强大的通用解决方案,具有庞大的社区,它看起来非常好用(见图3.4)。
图3.4 TensorBoard Web界面
从架构的角度来看,TensorBoard是一个Python Web服务,它可以在计算机上启动,启动时可以给它传入一个目录用于保存训练过程中要分析的数据。然后,将浏览器指向TensorBoard的端口(通常为6006),它会显示一个交互式Web界面,其中的值会实时更新。它既方便又好用,尤其是在远程计算机上进行训练时。
TensorBoard最初是作为TensorFlow的一部分进行部署的,但是最近,它变成了一个单独的项目(仍由Google维护),并且有自己的名称。但是,TensorBoard仍使用TensorFlow数据格式,因此要在PyTorch优化中展示训练的统计信息,需要同时安装tensorboard
和tensorflow
软件包。
从理论上讲,这就是监控网络所需的全部,因为tensorflow
软件包提供了一些类来编写TensorBoard能够读取的数据。但是,这不是很实用,因为这些类很底层。为了克服这个问题,有几个第三方开源库提供了方便的高级接口。本书使用的就是我的最爱之一,tensorboardX
(https://github.com/lanpa/tensorboardX)。它可以通过pip install tensorboardX
安装。
兼容性说明
在PyTorch 1.1中,支持了实验级别的TensorBoard格式功能,因此无须安装tensorboardX(有关详细信息,请查看https://pytorch.org/docs/stable/tensorboard.html)。但是由于PyTorch Ignite依赖它,我们仍然会使用该第三方软件包。
3.6.2 绘图
为了让你了解tensorboardX有多简单,我们来考虑一个与NN无关的小例子,它只是将内容写入TensorBoard(完整的示例代码在Chapter03/02_tensorboard.py
中)。
首先导入所需的包,创建数据编写器,并定义需要可视化的函数。默认情况下,SummaryWriter
每次启动都会在runs
目录下创建一个唯一目录,以便能够比较不同的训练。新目录的名称包括当前日期和时间以及主机名。可以通过将log_dir
参数传递给SummaryWriter
来覆盖它。还可以传入注释选项,在目录名称中添加后缀,一般是为了捕获不同实验的语义,如dropout=0.3
或strong_regularisation
。
此代码遍历以度为单位的角度范围,将其转换为弧度,然后计算函数的值。使用add_scalar
函数将每个值添加到编写器,add_scalar
函数有三个参数:参数名称、值和当前迭代(必须为整数)。
循环之后,需要做的最后一件事是关闭编写器。请注意,编写器会定期进行刷新(默认情况下,每两分钟刷新一次),因此即使在优化过程很漫长的情况下,仍可看到值。
运行此命令的结果不会在控制台输出,但是会在runs
目录中创建一个只有一个文件的新目录。要查看结果,需要启动TensorBoard:
如果在远程服务器上运行TensorBoard,则需要添加--bind_all
命令行选项以使其可以从外部访问。现在,在浏览器中打开http://localhost:6006
,就可以查看内容了,如图3.5所示。
图3.5 示例生成的图
该图是交互式的,可以将鼠标悬停在图形上查看实际值并选择区域放大来查看详细信息。在图形内部双击可以缩小图片。如果多次运行了程序,那么在左侧的Runs列表中会有多项,可以任意启用和禁用这些项目,从而比较不同优化的动态数据。TensorBoard不仅可以分析标量值,还可以分析图像、音频、文本数据和嵌入数据,甚至可以显示网络的结构。有关所有这些功能,请参考tensorboardX
和tensorboard
的文档。
现在,是时候结合在本章所学的内容用PyTorch实现真实的NN优化问题了。