快速入门MXBoard:MXNet数据可视化工具

作者 | Wu Jun
译者 | 无明
编辑 | Natalie,Vincent
AI 前线导读:本文将教你入门一款深受大众欢迎的 MXNet 数据可视化工具——MXBoard。

更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)

深度神经网络的设计和训练非常之难,通常涉及大量的调整、修改网络结构和尝试各种优化算法和超参数。从理论角度看,深度神经网络架构的数学基础仍然不够完善,相关技术通常是以经验性的成果作为基础。

所幸的是,数据可视化与生俱来的视觉特性可以弥补上述的部分缺陷,并描绘出更高层次的图像,在深度神经网络训练过程中助研究人员一臂之力。例如,在模型训练过程中,如果可以实时地绘制出梯度数据分布,就可以快速检测并纠正消失梯度或爆炸梯度现象。

随时间变化的梯度更新分布

另外,对词嵌入(word embedding)向量进行可视化可以清楚地看到单词在低维空间汇聚成不同的流形,从而保持语境接近度。另一个例子是数据聚类:使用 T-SNE 算法将高维数据映射到较低维空间。在深度学习过程中可以大量使用数据可视化,以便更好地理解训练过程和数据本身。

TensorBoard 的出现为 TensorFlow 用户带来了强大的可视化功能。我们已经收到许多不同用户的反馈,包括企业用户,因为 TensorBoard 提供了丰富的功能集,所以有很多人在使用 TensorFlow。这个强大的工具可以用在其他深度学习框架上吗?感谢 TeamHG-Memex 的努力以及他们的 tensorboard_logger,我们现在可以使用一个透明的接口将自定义数据写入事件文件,然后由 TensorBoard 来读取这些文件。

它基于我们开发的 MXboard,一个用于记录 MXNet 数据帧并在 TensorBoard 中展示它们的 Python 包。可以按照这些简单的说明(https://github.com/awslabs/mxboard)来安装 MXBoard。

注意:如果要使用 MXBoard 所有的功能,需要安装 MXNet 1.2.0。在 MXNet 1.2.0 正式发布之前,请安装 MXNet 的 nightly 版本:pip install --pre mxnet

MXBoard 快速入门指南

MXBoard 支持 TensorBoard 的大部分数据类型:

在设计 MXBoard API 时,我们参考了 tensorboard-pytorch API。所有的记录 API 都是在一个叫作 SummaryWriter 的类中定义的。这个类包含了记录文件的文件路径、写入频率、队列大小等信息。要记录特定数据类型的新数据,例如标量或图像,只需要在 SummaryWriter 对象上调用相应的 API。

例如,假设我们想绘制一个数据分布图,让它正态分布标准差逐渐减小。首先定义一个 SummaryWriter 对象,如下所示:

扫描二维码关注公众号,回复: 1499627 查看本文章

然后在每个循环中创建一个 NDArray,其中的值来自正态分布。然后,我们将 NDArray 传给 add_histogram() 函数,指定 bin 的数量和循环索引 i,它将作为数据点的索引。最后,与在 Python 中使用的任何文件描述符一样,调用.close() 来关闭 SummaryWriter 使用的文件句柄。

为了可视化图表,需要在终端上输入工作目录,然后输入以下命令启动 TensorBoard:

然后在浏览器的地址栏中输入 127.0.0.1:8888。点击 HISTOGRAM,你会看到下面的渲染图:

可视化越来越窄的正态分布

真实世界中的 MXBoard

使用上面学到的知识,我们尝试完成以下两项任务:

  1. 监控监督学习训练

  2. 了解卷积神经网络内部工作原理

训练 MNIST 模型

我们将使用 Gluon vision API 中的 MNIST 数据集,并使用 MXBoard 进行实时记录:

  • 交叉熵损失

  • 验证和训练的准确性

  • 梯度数据分布

这些都可以用作衡量训练进展的指标。

首先,我们定义一个 SummaryWriter 对象:

我们指定了 flush_secs=5,因为我们希望每五秒将记录写入日志文件中,这样就可以在浏览器中跟踪训练的实时进度。

然后我们记录每个批次结束时的交叉熵损失:

在每个批次结束时,我们将梯度记录为 HISTOGRAM 数据类型,并将训练和测试精度记录为 SCALAR 类型。

然后,我们同时运行 Python 训练脚本和 TensorBoard,以便在浏览器中可视化实时的训练进度。

要重现此实验,可以在 Github 上找到完整的代码。

梯度更新的分布

训练指标:交叉熵损失、训练准确性、验证验证准确性

卷积滤波器和特征映射的可视化

将卷积滤波器和特征映射可视化为图像是很有意义的,原因有两个:

  1. 当训练收敛时,卷积滤波器显示出清晰的图案检测特征、线条和独特的色彩。不收敛或过度拟合模型的卷积滤波器会显示出很多噪音。

  2. 观察滤波器和特征映射的 RGB 再现可以帮助我们理解学习到的和对网络有意义的特征,通常是边缘和颜色检测。

在这里,我们使用来自 MXNet Model Zoo 的三个预训练 CNN 模型,Inception-BN、Resnet-152 和 VGG16。第一个卷积层的滤波器直接在 TensorBoard 中显示,并与应用黑天鹅图像时得到的特征映射一起显示。我们可以注意到,网络可以具有不同的卷积核大小。


  • Inception-BN

Inception-BN:7x7 核

  • RESNET-152

RESNET-152:7x7 核

  • VGG16

VGG-16:3x3 核

可以看到,三个模型的滤波器表现出相当好的平滑性和规律性,这是一个已收敛模型的通常迹象。彩色滤波器主要负责提取图像中基于颜色的特征。灰度图像负责提取图像中对象的一般性图案和轮廓特征。视觉图像嵌入

最后一个例子同样有趣。嵌入是机器学习领域的一个关键概念,包括计算机视觉和自然语言处理(NLP)。它是高维数据到低维空间的映射表示。在传统的图像分类中,卷积神经网络倒数第二层的输出通常连接到具有 Softmax 激活的完全连接层,用于预测图像所属的类或类别。如果剥离掉这个分类层的网络,那么就只剩下一个网络,为每个样本输出一个特征向量,通常每个样本有 512 或 1024 个特征。这就是所谓的图像嵌入。我们可以调用 MXBoard 的 add_embedding() API 来观察投影到 2D 或 3D 空间的数据集的嵌入分布情况。具有相似视觉特征的图片将聚集在一起。

在这里,我们从验证中随机选择 2304 个图像,并使用 Resnet-152 计算它们的嵌入,将嵌入添加到 MXBoard 日志文件并对其进行可视化:

使用 PCA 算法的 Resnet-152 嵌入 3D 投影

默认情况下,我们使用 PCA 算法将 2304 图像的嵌入投影到 3D 空间中。但是聚类效果并不明显。这是因为 PCA 算法无法保持原始数据点之间的空间关系。因此,我们使用 TensorBoard 接口提供的 t-SNE 算法来更好地显示嵌入。构建最佳投影是一个动态的过程:

使用 T-SNE 算法的 Resnet-152 嵌入 3D 投影

在 t-SNE 算法收敛后,可以清楚地看到数据集被分成几个簇。

最后,我们可以使用 TensorBoard UI 来验证图像分类的正确性。我们在 TensorBoard GUI 的右上角输入“dog”。所有被分类为“dog”标签的验证数据集的图片都会突出显示。我们还可以看到,从 T-SNE 投影得出的聚类紧挨着分类边界。

突出显示狗的图像

所有相关代码和说明可以在这里(https://github.com/reminisce/mxboard-demo)找到。

结论

我们可以从这个 MXBoard 教程中看到,可视化是监督模型训练并深入了解深度学习原理的强大工具。MXBoard 为 MXNet 提供了一个简单、最低限度侵入式、易于使用的集中式可视化解决方案,适用于科学研究和生产环境。最重要的是,要使用它,你只需要一个浏览器。

英文原文链接:

https://medium.com/apache-mxnet/mxboard-mxnet-data-visualization-2eed6ae31d2c



猜你喜欢

转载自juejin.im/post/5b1651da51882513734f54b8