pytorch中的tensorboard使用

pytorch中的tensorboard使用

  • 1. tensorboard介绍
  • 2. tensorboard的安装
  • 3. 使用各种add方法记录数据
    • 3.1 数字(scalar)
    • 1.2 图片(image)
    • 1.3 直方图(histogram)
    • 1.4 运行图(graph)
    • 1.5 嵌入向量(embedding)
    • 1.6 其他
  • 一些tips

1. tensorboard介绍

  在训练神经网络时,我们希望能更直观地了解情况,包括损失曲线、输入图片、输出图片、卷积核的参数分布等信息。这些信息能帮助我们更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的方法就是打印输出,但其职能打印数值信息,不够直观,无法同时查看分布、图片、声音等。不过,我们可以借助于可视化工具Tensorboard来实现以上需求。
  PyTorch从1.2.0版本开始,正式自带了内置的Tensorboard支持了,可以不依赖于第三方工具来进行可视化。

2. tensorboard的安装

  1. 安装tensorflow
pip install tensorflow
  1. 安装tensorboard
pip install tensorboard
  1. 安装tensorboardX
pip install tensorboardX

  到这里,你可能会有疑问,为什么安装了tensorboard又安装了tensorboardX,这两者之间有什么关系?在PyTorch刚发布那段时间,是不支持tensorboard这样强大的数据可视化工具的,于是就有人开发了tensorboradX,一个完全支持Pytorch的tensorboard工具包,从而让Pytorch很好地调用tensorboard的数据可视化工具来监控网络训练的过程。其实,tensorboardX与官方的tensorboard的使用方式并无差异,唯一的不同就是要在导入时用tensorboardX替代tensorboard,因此tensorboardX就是为Pytorch精心打造的,解决早期的Pytorch在数据可视化功能上的不足。不过,上面我们也提到,Pytorch从1.2.0版本开始,就正式自带了内置的Tensorboard了。

3. 使用各种add方法记录数据

  下面详细介绍SummaryWriter实例的各种数据记录方法,并提供相应的示例供参考。

3.1 数字(scalar)

  使用add_scalar方法来记录数字常量。

add_scalar(tag, scalar_value, global_step=None, walltime=None)

参数:

  • tag(String): 数据名称,不同名称的数据使用不同曲线展示
  • scalar_value(float): 数字常量值
  • global_step(int, optional): 训练的step
  • walltime(float, optional): 记录发生的时间,默认为time.time()

  需要注意,这里的scalar_value一定是float类型,如果是Pytorch scalar tensor, 则需要调用.item()方法获取其数值。我们一般会使用add_scalar方法来记录训练过程的loss、accuracy、learning rate等数值的变化,直观地监控训练过程。

Example

from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**2, global_step=i)
    writer.add_scalar('exponential', 2**i, global_step=i)

  这里,我们在一个路径为runs/scalar_example的run中分别写入了二次函数数据quadratic和指数函数数据exponential,在浏览器可视化界面中效果如下:

执行命令:tensorboard --logdir=./runs/scalar_example --host=127.0.0.1
【注意】一定要加上--host参数,否则会连接页面失败

pytorch中的tensorboard使用_第1张图片

1.2 图片(image)

  使用add_image方法来记录单个图像数据,注意,该方法需要pillow库的支持。

add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')

参数:

  • tag(String):数据名称
  • img_tensor(torch.Tensor/numpy.array):图像数据
  • global_step(int, optional):训练的step
  • walltime(float, optional):记录发生的时间,默认为time.time()
  • dataformats(string, optional):图像数据的格式,默认为CHW,即Channel x Height x Width,还可以是CHWHWCHW

我们一般会使用add_image来实时观察生成式模型的生成效果,或者可视化分割、目标检测的结果,帮助调试模型。

from tensorboardX import SummaryWriter
import cv2 as cv

writer = SummaryWriter('runs/image_example')
for i in range(1, 6):
    writer.add_image('countdown',
                     cv.cvtColor(cv.imread('{}.jpg'.format(i)), cv.COLOR_BGR2RGB),
                     global_step=i,
                     dataformats='HWC')

  这里我们使用opencv读入图片,opencv读入的图片通道排列是BGR,因此需要先转换成RGB以保证颜色正确,并且dataformats设为HWC,而非默认的CHW。调用这个方法一定要保证数据的格式正确,像PyTorch Tensor的格式就是默认的CHW。效果如下,可以拖动滑动条来查看不同的global_step下的图片。
pytorch中的tensorboard使用_第2张图片add_image方法只能一次插入一张图片,如果要一次插入多张图片,有两种方法:

  1. 使用torchvision中的make_grid方法将多张图片拼合成一张图片后,再调用add_image方法。
  2. 使用SummaryWriteradd_images方法,参数和add_image类似,在此不再另行介绍。

1.3 直方图(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): 最大分桶数

我们可以通过观察数据、训练参数、特征的直方图,了解到它们大致的分布情况,辅助神经网络的训练过程。

示例:

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"界面。

pytorch中的tensorboard使用_第3张图片pytorch中的tensorboard使用_第4张图片

1.4 运行图(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 给出了一个官方样例大家可以尝试。样例运行效果如下:

1.5 嵌入向量(embedding)

使用 add_embedding 方法可以在二维或三维空间可视化 embedding 向量。

add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)

参数

  • 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
)

pytorch中的tensorboard使用_第5张图片
可以发现,虽然还没有做任何特征提取的工作,但 MNIST 的数据已经呈现出聚类的效果,相同数字之间距离更近一些(有没有想到 KNN 分类器)。我们还可以点击左下方的 T-SNE,用 t-SNE 的方法进行可视化。add_embedding 方法需要注意的几点:

  • mat 是二维 MxN,metadata 是一维 N,label_img 是四维 NxCxHxW!
  • label_img 记得归一化为 0-1 之间的 float 值

1.6 其他

TensorboardX 除了上述的常用方法之外,还有许多其他方法如 add_audioadd_figure 等,感兴趣的朋友可以参考官方文档。相信读了这篇文章过后,你已经能够类比熟练调用其他的方法了。

一些tips

  1. 如果在进入 embedding 可视化界面时卡住,请更新 tensorboard 至最新版本 (>=1.12.0)。
  2. tensorboard 有缓存,如果进行了一些 run 文件夹的删除操作,最好重启 tensorboard,以避免无效数据干扰展示效果。
  3. 如果执行 add 操作后没有实时在网页可视化界面看到效果,试试重启 tensorboard。

参考文档:
[1]: https://blog.csdn.net/weixin_43002433/article/details/107109776
[2]: https://www.jianshu.com/p/77f2c15572dc
[3]: https://blog.csdn.net/bigbennyguo/article/details/87956434

你可能感兴趣的:(人工智能,pytorch)