参考文章:详解PyTorch项目使用TensorboardX进行训练可视化
这篇文章虽然说的是TensorboardX
,但其实只要我们把TensorboardX
直接换成torch.utils.tensorboard
就可以了,至少经过我的测试是没有问题的,如果有问题欢迎大家指出来!!!
pip install tensorflow
在pytorch中安装tensorflow,此时默认安装的是tf2.1,同时它还会默认安装我们需要的tensorboard
torch.utils.tensorboard
这个pytorch自己的API,那么我们为什么还要安装tensorflow呢?其实一开始我也有这样的疑问,后来看了一下这个API的实现方式之后发现,其实是因为它内部的代码实现就是用的tensorflow,所以我们必须安装tensorflow首先,需要创建一个 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/exp1
、runs/exp2。
接下来,我们就可以调用 SummaryWriter
实例的各种 add_something
方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:
tensorboard --logdir=
其中的
既可以是单个 run 的路径,如上面 writer1 生成的runs/exp
;也可以是多个 run 的父目录,如runs/
下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令 –logdir=runs/
就可以在 tensorboard 可视化界面中方便地横向比较 runs/
下不同次实验所得数据的差异。
add
方法来添加记录数据使用 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
方法来记录训练过程的 loss
、accuracy
、learning 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
,在浏览器可视化界面中效果如下:
接下来我们在另一个路径为 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)
使用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
下的图片:
使用 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()
以上只列出了常见的三种我们在训练模型过程中记录的数据,其实我们还可以向tensorboard
中添加直方图 (histogram)
和嵌入向量 (embedding)
,有兴趣的可以参考原文章:详解PyTorch项目使用TensorboardX进行训练可视化