pytorch学习笔记九:通过torch.utils.tensorboard在pytorch中使用tensorboard

参考文章:详解PyTorch项目使用TensorboardX进行训练可视化

这篇文章虽然说的是TensorboardX,但其实只要我们把TensorboardX直接换成torch.utils.tensorboard就可以了,至少经过我的测试是没有问题的,如果有问题欢迎大家指出来!!!

一、环境准备:
  • 我的环境是最新的pytorch1.4,然后使用pip install tensorflow在pytorch中安装tensorflow,此时默认安装的是tf2.1,同时它还会默认安装我们需要的tensorboard
  • 注意,有朋友可能有疑问:既然我们是直接使用的torch.utils.tensorboard这个pytorch自己的API,那么我们为什么还要安装tensorflow呢?其实一开始我也有这样的疑问,后来看了一下这个API的实现方式之后发现,其实是因为它内部的代码实现就是用的tensorflow,所以我们必须安装tensorflow
二、初步了解tensorboard应该如何使用

首先,需要创建一个 SummaryWriter 的示例:

from torch.utils.tensorboard import SummaryWriter

# Creates writer1 object.
# The log will be saved in 'runs/exp'
writer1 = SummaryWriter('runs/exp')

# Creates writer2 object with auto generated file name
# The log directory will be something like 'runs/Aug20-17-20-33'
writer2 = SummaryWriter()

# Creates writer3 object with auto generated file name, the 
# comment will be appended to the filename.
# The log directory will be something like 'runs/Aug20-17-20-33-resnet'
writer3 = SummaryWriter(comment='resnet')

以上展示了三种初始化 SummaryWriter 的方法:

  • 提供一个路径,将使用该路径来保存日志
  • 无参数,默认将使用 runs/日期时间 路径来保存日志
  • 提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志

一般来讲,我们对于每次实验新建一个路径不同的 SummaryWriter,也叫一个 run,如 runs/exp1runs/exp2。

接下来,我们就可以调用 SummaryWriter 实例的各种 add_something方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:

tensorboard --logdir=

其中的 既可以是单个 run 的路径,如上面 writer1 生成的runs/exp;也可以是多个 run 的父目录,如runs/ 下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令 –logdir=runs/ 就可以在 tensorboard 可视化界面中方便地横向比较 runs/ 下不同次实验所得数据的差异。

三、下面来详细的说一下如何使用add方法来添加记录数据
  • 数字 (scalar)

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

'''
参数解释:

tag (string): 数据名称,不同名称的数据使用不同曲线展示

scalar_value (float): 数字常量值

global_step (int, optional): 训练的 step

walltime (float, optional): 记录发生的时间,默认为 time.time()
'''
add_scalar(tag, scalar_value, global_step=None, walltime=None)

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

下面举个例子来看一下:

from torch.utils.tensorboard 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,在浏览器可视化界面中效果如下:
pytorch学习笔记九:通过torch.utils.tensorboard在pytorch中使用tensorboard_第1张图片
接下来我们在另一个路径为 runs/another_scalar_example 的 run 中写入名称相同但参数不同的二次函数和指数函数数据,可视化效果如下。我们发现相同名称的量值被放在了同一张图表中展示,方便进行对比观察。同时,我们还可以在屏幕左侧的 runs 栏选择要查看哪些 run 的数据。

writer = SummaryWriter('runs/another_scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**3, global_step=i)
    writer.add_scalar('exponential', 3**i, global_step=i)

pytorch学习笔记九:通过torch.utils.tensorboard在pytorch中使用tensorboard_第2张图片

  • 图片 (image)

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

'''
参数

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,还可以是 'CHW'、'HWC' 或 'HW' 等
'''
add_image(tag, img_tensor, global_step=None, 
          walltime=None, dataformats='CHW')

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

下面举个例子:

from torch.utils.tensorboard 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学习笔记九:通过torch.utils.tensorboard在pytorch中使用tensorboard_第3张图片

  • 运行图 (graph)

使用 add_graph方法来可视化一个神经网络。

'''
model (torch.nn.Module): 待可视化的网络模型

input_to_model (torch.Tensor or list of torch.Tensor, optional): 
待输入神经网络的变量或一组变量
'''
add_graph(model, input_to_model=None, 
          verbose=False, **kwargs)
import torch
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets, transforms

# Writer will output to ./runs/ directory by default
writer = SummaryWriter()

transform = transforms.Compose([transforms.ToTensor(), 
                  transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST('mnist_train', train=True, 
                          download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, 
                                          batch_size=64, 
                                          shuffle=True)

model = torchvision.models.resnet50(False)
# Have ResNet model take in grayscale rather than RGB
model.conv1 = torch.nn.Conv2d(1, 64, 
                             kernel_size=7, 
                             stride=2, 
                             padding=3, 
                             bias=False)

images, labels = next(iter(trainloader))
writer.add_graph(model, images)
writer.close()

pytorch学习笔记九:通过torch.utils.tensorboard在pytorch中使用tensorboard_第4张图片

以上只列出了常见的三种我们在训练模型过程中记录的数据,其实我们还可以向tensorboard中添加直方图 (histogram)嵌入向量 (embedding),有兴趣的可以参考原文章:详解PyTorch项目使用TensorboardX进行训练可视化

你可能感兴趣的:(PyTorch学习笔记,可视化,深度学习,pytorch)