PyTorch项目使用TensorboardX进行训练可视化
转自:(41条消息) 详解PyTorch项目使用TensorboardX进行训练可视化_浅度寺-CSDN博客_tensorboardx
什么是TensorboardX
Tensorboard 是 TensorFlow 的一个附加工具,可以记录训练过程的数字、图像等内容,以方便研究人员观察神经网络训练过程。可是对于 PyTorch 等其他神经网络训练框架并没有功能像 Tensorboard 一样全面的类似工具,一些已有的工具功能有限或使用起来比较困难 (tensorboard_logger, visdom等) 。TensorboardX 这个工具使得 TensorFlow 外的其他神经网络框架也可以使用到 Tensorboard 的便捷功能。TensorboardX 的 github仓库在这里。
配置TensorboardX
github仓库中README 的要求进行环境配置。
[官方文档] 将多张图片拼合成一张图片后,再调用 add_image
方法。
add_image
方法。
SummaryWriter
的 add_images
方法 [官方文档],参数和 add_image
类似,在此不再另行介绍。直方图 (histogram)
使用 add_histogram
方法来记录一组数据的直方图。
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
参数
tag (string): 数据名称 values (torch.Tensor, numpy.array, or string/blobname): 用来构建直方图的数据 global_step (int, optional): 训练的 step bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 该参数决定了分桶的方式,详见这里。 walltime (float, optional): 记录发生的时间,默认为 time.time() max_bins (int, optional): 最大分桶数
我们可以通过观察数据、训练参数、特征的直方图,了解到它们大致的分布情况,辅助神经网络的训练过程。
Example
from tensorboardX import SummaryWriter import numpy as np writer = SummaryWriter('runs/embedding_example') writer.add_histogram('normal_centered', np.random.normal(0, 1, 1000), global_step=1) writer.add_histogram('normal_centered', np.random.normal(0, 2, 1000), global_step=50) writer.add_histogram('normal_centered', np.random.normal(0, 3, 1000), global_step=100)
我们使用 numpy 从不同方差的正态分布中进行采样。打开浏览器可视化界面后,我们会发现多出了"DISTRIBUTIONS"和"HISTOGRAMS"两栏,它们都是用来观察数据分布的。其中在"HISTOGRAMS"中,同一数据不同 step 时候的直方图可以上下错位排布 (OFFSET) 也可重叠排布 (OVERLAY)。如下第一图为"DISTRIBUTIONS"界面,第二和第三为"HISTOGRAMS"界面。
同一数据不同 step 时候的直方图可以上下错位排布 (OFFSET) 也可重叠排布 (OVERLAY):分别对应如下2图
运行图 (graph)
使用 add_graph
方法来可视化一个神经网络。
add_graph(model, input_to_model=None, verbose=False, **kwargs)
参数
model (torch.nn.Module): 待可视化的网络模型
input_to_model (torch.Tensor or list of torch.Tensor, optional): 待输入神经网络的变量或一组变量
该方法可以可视化神经网络模型,TensorboardX 给出了一个官方样例大家可以尝试。样例运行效果如下:
嵌入向量 (embedding)
使用 add_embedding
方法可以在二维或三维空间可视化 embedding 向量。
参数
mat (torch.Tensor or numpy.array): 一个矩阵,每行代表特征空间的一个数据点 metadata (list or torch.Tensor or numpy.array, optional): 一个一维列表,mat 中每行数据的 label,大小应和 mat 行数相同 label_img (torch.Tensor, optional): 一个形如 NxCxHxW 的张量,对应 mat 每一行数据显示出的图像,N 应和 mat 行数相同 global_step (int, optional): 训练的 step tag (string, optional): 数据名称,不同名称的数据将分别展示
add_embedding 是一个很实用的方法,不仅可以将高维特征使用PCA、t-SNE等方法降维至二维平面或三维空间显示,还可观察每一个数据点在降维前的特征空间的K近邻情况。下面例子中我们取 MNIST 训练集中的 100 个数据,将图像展成一维向量直接作为 embedding,使用 TensorboardX 可视化出来。(下面是原博主代码,但是运行时出现错误,可能版本问题)
from tensorboardX import SummaryWriter import torchvision writer = SummaryWriter('runs/embedding_example') mnist = torchvision.datasets.MNIST('mnist', download=True) writer.add_embedding( mnist.train_data.reshape((-1, 28 * 28))[:100,:], metadata=mnist.train_labels[:100], label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255, global_step=0 )
修改后的代码:
from tensorboardX import SummaryWriter import torchvision writer = SummaryWriter('runs/embedding_example1') mnist = torchvision.datasets.MNIST('mnist', download=True) writer.add_embedding( mnist.data.reshape((-1, 28 * 28))[:100,:], metadata=mnist.targets[:100], label_img = mnist.data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255, global_step=0 )
采用 PCA 降维后在三维空间可视化效果如下:
可以发现,虽然还没有做任何特征提取的工作,但 MNIST 的数据已经呈现出聚类的效果,相同数字之间距离更近一些(有没有想到 KNN 分类器)。我们还可以点击左下方的 T-SNE
,用 t-SNE 的方法进行可视化。
add_embedding
方法需要注意的几点:
mat 是二维 MxN,metadata 是一维 N,label_img 是四维 NxCxHxW! label_img 记得归一化为 0-1 之间的 float 值
其他
TensorboardX 除了上述的常用方法之外,还有许多其他方法如 add_audio
、add_figure
等,感兴趣的朋友可以参考[官方文档]。相信读了这篇文章过后,你已经能够类比熟练调用其他的方法了。
一些tips
(1)如果在进入 embedding 可视化界面时卡住,请更新 tensorboard 至最新版本 (>=1.12.0)。
(2)tensorboard 有缓存,如果进行了一些 run 文件夹的删除操作,最好重启 tensorboard,以避免无效数据干扰展示效果。
(3)如果执行 add 操作后没有实时在网页可视化界面看到效果,试试重启 tensorboard。
————————————————