参考文章:详解PyTorch项目使用TensorboardX进行训练可视化
这篇文章虽然说的是
一、环境准备:
- 我的环境是最新的pytorch1.4,然后使用
pip install tensorflow 在pytorch中安装tensorflow,此时默认安装的是tf2.1,同时它还会默认安装我们需要的tensorboard - 注意,有朋友可能有疑问:既然我们是直接使用的
torch.utils.tensorboard 这个pytorch自己的API,那么我们为什么还要安装tensorflow呢?其实一开始我也有这样的疑问,后来看了一下这个API的实现方式之后发现,其实是因为它内部的代码实现就是用的tensorflow,所以我们必须安装tensorflow
二、初步了解tensorboard应该如何使用
首先,需要创建一个 SummaryWriter 的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 路径来保存日志
一般来讲,我们对于每次实验新建一个路径不同的
接下来,我们就可以调用
其中的
三、下面来详细的说一下如何使用add 方法来添加记录数据
- 数字 (scalar)
使用
1 2 3 4 5 6 7 8 9 10 11 12 | ''' 参数解释: 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) |
需要注意,这里的
下面举个例子来看一下:
1 2 3 4 5 | 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) |
这里,我们在一个路径为

接下来我们在另一个路径为
1 2 3 4 | 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) |

- 图片 (image)
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ''' 参数 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· 来实时观察生成式模型的生成效果,或者可视化分割、目标检测的结果,帮助调试模型。
下面举个例子:
1 2 3 4 5 6 7 8 9 10 | 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') |
这里我们使用

- 运行图 (graph)
使用
1 2 3 4 5 6 7 8 | ''' 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) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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() |

以上只列出了常见的三种我们在训练模型过程中记录的数据,其实我们还可以向