5.3 可视化工具
在训练神经网络时,我们希望能更直观地了解训练情况,包括损失曲线、输入图片、输出图片、卷积核的参数分布等信息。这些信息能帮助我们更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的办法就是打印输出,但其只能打印数值信息,不够直观,同时无法查看分布、图片、声音等。在本节,我们将介绍两个深度学习中常用的可视化工具:Tensorboard 和 Visdom。
5.3.1 Tensorboard
Tensorboard 最初是作为 TensorFlow 的可视化工具迅速流行开来。作为和 TensorFlow 深度集成的工具,Tensorboard 能够展现你的 TensorFlow 网络计算图,绘制图像生成的定量指标图以及附加数据。但同时 Tensorboard 也是一个相对独立的工具,只要用户保存的数据遵循相应的格式,tensorboard 就能读取这些数据并进行可视化。这里我们将主要介绍如何在 PyTorch 中使用 tensorboard_logger^1 进行训练损失的可视化。 Tensorboard_logger 是 TeamHG-Memex 开发的一款轻量级的工具,它将 Tensorboard 的功能抽取出来,使得非 TensorFlow 用户也能使用它进行可视化,但其支持的功能有限。
tensorboard_logger 的安装主要分为以下两步:
- 安装 TensorFlow:如果电脑中已经安装完 TensorFlow 可以跳过这一步,如果电脑中尚未安装,建议安装 CPU-Only 的版本,具体安装教程参见 TensorFlow 官网 ^1 ,或使用 pip 直接安装,教育网用户则可通过清华的源提高速度 ^2 。
- 安装 tensorboard_logger:可通过
pip install tensorboard_logger
命令直接安装。
tensorboard_logger 的使用非常简单。首先用如下命令启动 tensorboard:
tensorboard --logdir <your/running/dir> --port <your_bind_port>
下面举例说明 tensorboard_logger 的使用。
from tensorboard_logger import Logger
/usr/local/lib/python3.5/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
# 构建 logger 对象,logdir 用来指定 log 文件的保存路径
# flush_secs 用来指定刷新同步间隔
logger = Logger(logdir='experimient_cnn', flush_secs=2)
for ii in range(100):
logger.log_value('loss', 10-ii**0.5, step=ii)
logger.log_value('accuracy', ii**0.5/10)
打开浏览器输入 http://localhost:6006
(其中 6006 应改成你的 tensorboard 所绑定的端口), 左侧的 Horizontal Axis 下有三个选项,分别是:
- Step:根据步长来记录,log_value 时如果有步长,则将其作为 x 轴坐标描点画线。
- Relative:用前后相对顺序描点画线,可认为 logger 自己维护了一个
step
属性,每调用一次 log_value 就自动加1。 - Wall:按时间排序描点画线。
左侧的 Smoothing 条可以左右拖动,用来调节平滑的幅度。点击右上角的刷新按钮可立即刷新结果,默认是每 30s 自动刷新数据。可见 tensorboard_logger 的使用十分简单,但它只能统计简单的数值信息,不支持其它功能。
除了 tensorboard_logger 之外,还有专门针对 PyTorch 开发的 TensorboardX ^4 ,它封装了更多的 Tensorboard 接口,支持记录标量,图片,直方图,声音,文本,计算图和 embedding 等信息,几乎是和 TensorFlow 的 Tensorboard 完全一样的功能,使用接口甚至比 TensorFlow 的 Tensorboard 接口还要简单。感兴趣的读者可以执行了解,本节将把更多的内容留给另一个可视化工具:Visdom。
5.3.2 Visdom
Visdom ^5 是 Facebook 专门为 PyTorch 开发的一款可视化工具,其开源于 2017 年 3 月。Visdom 十分轻量级,但却支持非常丰富的功能,能胜任大多数的科学运算可视化任务。其可视化界面如图 3 所示。
Visdom 可以创造、组织和共享多种数据的可视化,包括数值、图像、文本,甚至是视频,其支持 PyTorch、Torch 及 Numpy。用户可通过编程组织可视化空间,或通过用户接口为生动数据打造仪表板,检查实验结果或调试代码。
Visdom 中有两个重要概念:
- env:环境。不同环境的可视化结果相互隔离,互不影响,在使用时如果不指定 env,默认使用
main
。不同用户、不同程序一般使用不同的 env。 - pane:窗格。窗格可用于可视化图像、数值或打印文本等,其可以拖动、缩放、保存和关闭。一个程序中可使用同一个 env 中的不同 pane,每个 pane 可视化或记录某一信息。
如图 4 所示,当前 env 共有两个 pane,一个用于打印 log,另一个用于记录损失函数的变化。点击 clear 按钮可以清空当前 env 的所有 pane,点击 save 按钮可将当前 env 保存成 json 文件,保存路径位于 ~/.visdom/
目录下。也可修改 env 的名字后点击 fork,保存当前 env 的状态至更名后的 env。
Visdom 的安装可通过命令 pip install visdom
。安装完成后,需通过 python -m visdom.server
命令启动 visdom 服务,或通过 nohup python -m visdom.server &
命令将服务放至后台运行。Visdom 服务是一个 web server 服务,默认绑定 8097 端口,客户端与服务器间通过 tornado 进行非阻塞交互。
Visdom 的使用有两点需要注意的地方:
- 需手动指定保存 env,可在 web 界面点击 save 按钮或在程序中调用 save 方法,否则 visdom 服务重启后,env 等信息会丢失。
- 客户端与服务器之间的交互采用 tornado 异步框架,可视化操作不会阻塞当前程序,网络异常也不会导致程序退出。
Visdom 以 Plotly 为基础,支持丰富的可视化操作,下面举例说明一些最常用的操作。
%%sh
# 启动 visdom 服务器
# nohup python -m visdom.server &
import visdom
# 新建一个连接客户端
# 指定 env = u'test1',默认端口为 8097,host 是‘localhost'
vis = visdom.Visdom(env=u'test1')
x = t.arange(1, 30, 0.01)
y = t.sin(x)
vis.line(X=x, Y=y, win='sinx', opts={'title': 'y=sin(x)'})
'sinx'
输出的结果如图 5 所示。
下面逐一分析这几行代码:
- vis = visdom.Visdom(env=u'test1'),用于构建一个客户端,客户端除指定 env 之外,还可以指定 host、port 等参数。
- vis 作为一个客户端对象,可以使用常见的画图函数,包括:
- line:类似 Matlab 中的
plot
操作,用于记录某些标量的变化,如损失、准确率等 - image:可视化图片,可以是输入的图片,也可以是 GAN 生成的图片,还可以是卷积核的信息
- text:用于记录日志等文字信息,支持 html 格式
- histgram:可视化分布,主要是查看数据、参数的分布
- scatter:绘制散点图
- bar:绘制柱状图
- pie:绘制饼状图
- 更多操作可参考 visdom 的 github 主页
- line:类似 Matlab 中的
这里主要介绍深度学习中常见的 line、image 和 text 操作。
Visdom 同时支持 PyTorch 的 tensor 和 Numpy 的 ndarray 两种数据结构,但不支持 Python 的 int、float 等类型,因此每次传入时都需先将数据转成 ndarray 或 tensor。上述操作的参数一般不同,但有两个参数是绝大多数操作都具备的:
- win:用于指定 pane 的名字,如果不指定,visdom 将自动分配一个新的 pane。如果两次操作指定的 win 名字一样,新的操作将覆盖当前 pane 的内容,因此建议每次操作都重新指定 win。
- opts:选项,接收一个字典,常见的 option 包括
title
、xlabel
、ylabel
、width
等,主要用于设置 pane 的显示格式。
之前提到过,每次操作都会覆盖之前的数值,但往往我们在训练网络的过程中需不断更新数值,如损失值等,这时就需要指定参数 update='append'
来避免覆盖之前的数值。而除了使用 update 参数以外,还可以使用 vis.updateTrace
方法来更新图,但 updateTrace
不仅能在指定 pane 上新增一个和已有数据相互独立的 Trace,还能像 update='append'
那样在同一条 trace 上追加数据。
# append 追加数据
for ii in range(0, 10):
# y = x
x = t.Tensor([ii])
y = x
vis.line(X=x, Y=y, win='polynomial', update='append' if ii>0 else None)
# updateTrace 新增一条线
x = t.arange(0, 9, 0.1)
y = (x ** 2) / 9
vis.updateTrace(X=x, Y=y, win='polynomial', name='this is a new Trace')
'polynomial'
打开浏览器,输入 http://localhost:8097
,可以看到如图 6 所示的结果。
image 的画图功能可分为如下两类:
image
接收一个二维或三维向量,$H\times W$或$3 \times H\times W$,前者是黑白图像,后者是彩色图像。images
接收一个四维向量$N\times C\times H\times W$,$C$可以是 1 或 3,分别代表黑白和彩色图像。可实现类似 torchvision 中 make_grid 的功能,将多张图片拼接在一起。images
也可以接收一个二维或三维的向量,此时它所实现的功能与 image 一致。
# 可视化一个随机的黑白图片
vis.image(t.randn(64, 64).numpy())
# 随机可视化一张彩色图片
vis.image(t.randn(3, 64, 64).numpy(), win='random2')
# 可视化 36 张随机的彩色图片,每一行 6 张
vis.images(t.randn(36, 3, 64, 64).numpy(), nrow=6, win='random3', opts={'title':'random_imgs'})
'random3'
其中 images 的可视化输出如图 7 所示。
vis.text
用于可视化文本,支持所有的 html 标签,同时也遵循着 html 的语法标准。例如,换行需使用 <br>
标签, \r\n
无法实现换行。下面举例说明。
vis.text(u'''<h1>Hello Visdom</h1><br>Visdom 是 Facebook 专门为<b>PyTorch</b>开发的一个可视化工具,
在内部使用了很久,在 2017 年 3 月份开源了它。
Visdom 十分轻量级,但是却有十分强大的功能,支持几乎所有的科学运算可视化任务''',
win='visdom',
opts={'title': u'visdom 简介' }
)
'visdom'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论