PyTorch 中 TensorBoard 可视化模块应用

简介

Tensorboard 原本是 tensorflow 的可视化工具,pytorch 从1.2.0开始支持tensorboard。之前的版本也可以使用tensorboardX 代替。它在 PyTorch 中的模块为 torch.utils.tensorboard

使用 tensorboard,我们可以在 TensorBoard UI 的框架内把 PyTorch 的模型和数据记录到文件夹内。

支持的可视化有:标量,图片,直方图,图表,嵌入,Caffe 2 nets 和 blobs。

Scalars, images, histograms, graphs, and embedding visualizations are all supported for PyTorch models and tensors as well as Caffe2 nets and blobs.

Tensorboard 的工作流程为:

  • 将代码运行过程中的数据写入一个文件夹中。(由代码中的 SummaryWriter 完成)
  • 读取这个文件夹中的数据,用浏览器显示出来。(在命令行运行 tensorboard 完成)

接下来将分别介绍 SummaryWriter 和命令行 tensorboard 的使用方法。

SummaryWriter

一个简单实例:

1
2
3
4
5
6
7
8
9
10
from torch.utils.tensorboard import SummaryWriter
import numpy as np

writer = SummaryWriter()

for n_iter in range(100):
writer.add_scalar('Loss/train', np.random.random(), n_iter)
writer.add_scalar('Loss/test', np.random.random(), n_iter)
writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
writer.add_scalar('Accuracy/test', np.random.random(), n_iter)

可以看到,首先创建 SummaryWriter 的实例来对写入文件夹等等进行总体控制,然后再通过实例写入。SummaryWriter 的初始化参数如下:

  • log_dir (string) - 保存目录位置。默认为 runs/CURRENT_DATETIME_HOSTNAME,因为每次运行的时间都会改变,所以每次都会写入新文件夹。平常使用时可以使用层级结构,如 runs/exp1runs/exp2,方便对实验进行比较。
  • purge_step (int) - 当 log 在 $T+X$ 步崩溃导致意外终止,然后在 $T$ 步重启时,可以指定 purge_step。大于等于 $T$ 步的数据会在 TensorBoard 里被清除然后隐藏。注意重启的实验和崩溃的实验应该指定同一 log_dir 文件目录。

命令行 tensorboard 可视化

常用的命令就两个参数 --logdir--port

  • logdir:需要可视化的目录位置。
  • port:tensorboard 可视化显示的 localhost 端口。

示例:

1
tensorboard --logdir=./runs --port 4000

写数据方法

就像在 SummaryWriter 中展示的,tensorboard 通过 SummaryWriter 的各种方法来向目录文件中写入数据,除了 add_scalar 方法外,还有许多方法,本节将一一进行介绍。

add_scalar

将标量数据添加到 summary。

add_scalar(tag, scalar_value, global_step=None)

  • tag:数据 ID。
  • scalar_value:需要存储的值。
  • global_step:全局的步骤数。

实例:

1
2
3
4
5
6
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
writer.add_scalar('y=2x', i * 2, i)
writer.close()

add_scalars

批量添加标量数据到 summary。

add_scalars(main_tag, tag_scalar_dict, global_step=None)

  • main_tag:所有 tag 的主标签。
  • tag_scalar_dict:存储的标签和值的键值对。
  • global_step:全局的步骤数。

实例:

1
2
3
4
5
6
7
8
9
from torch.utils.tensorboard import SummaryWriter
import numpy as np
writer = SummaryWriter()
r = 5
for i in range(100):
writer.add_scalars('run_14h', {'xsinx':i*np.sin(i/r),
'xcosx':i*np.cos(i/r),
'tanx': np.tan(i/r)}, i)
writer.close()

注意,该方法存储时不是将 xsinx, xcosx, tanx 存储在 run_14h 这个 section 下,而是在主文件夹下将三个值存入 run_14h_xsinx, run_14h_xcosx, run_14h_tanx 文件夹。

如果想存储在一个 section 下,还是使用 add_scalar 方法,如:

1
2
writer.add_scalar('Loss/loss1', loss1, step)
writer.add_scalar('Loss/loss2', loss2, step)

add_histogram

将直方图添加到 summary。

add_histogram(tag, values, global_step)

  • tag:数据 ID。
  • values:建立直方图的值。(type 为 torch.Tensor 或者 numpy.array)
  • global_step:全局的步骤数。

实例:

1
2
3
4
5
6
7
from torch.utils.tensorboard import SummaryWriter
import numpy as np
writer = SummaryWriter()
for i in range(10):
x = np.random.random(1000)
writer.add_histogram('distribution centers', x + i, i)
writer.close()

add_image

将图片信息添加到 summary。注意需要安装 pillow 包。

add_image(tag, img_tensor, global_step=None, dataformats=’CHW’)

  • tag:数据 ID。

  • img_tensor:图片数据。

  • global_step:全局的步骤数。

  • dataformats:数据格式,如 CHW, HWC, HWH 为高, W为宽, C 为通道数。

Shape:

img_tensor 默认为 $(3, H,W)$。可以使用 torchvision.utils.make_grid() 把一个 batchtensor 转换成 $3\times H\times W$ 的格式。如果 img_tensor 为其他格式,需要更改 dataformats 为对应的格式。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from torch.utils.tensorboard import SummaryWriter
import numpy as np
img = np.zeros((3, 100, 100))
img[0] = np.arange(0, 10000).reshape(100, 100) / 10000
img[1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000

img_HWC = np.zeros((100, 100, 3))
img_HWC[:, :, 0] = np.arange(0, 10000).reshape(100, 100) / 10000
img_HWC[:, :, 1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000

writer = SummaryWriter()
writer.add_image('my_image', img, 0)

# If you have non-default dimension setting, set the dataformats argument.
writer.add_image('my_image_HWC', img_HWC, 0, dataformats='HWC')
writer.close()

add_images

将一个 batch 的图片数据添加到 summary。注意需要安装 pillow 包。

add_images(tag, img_tensor, global_step=None, dataformats=’NCHW’)

  • tag:数据 ID。

  • img_tensor:图片数据。

  • global_step:全局的步骤数。

  • dataformats:数据格式,如 NCHW, NHWC, CHWH 为高, W为宽, C 为通道数。

Shape:

img_tensor 默认为 $(N,3, H,W)$。如果 img_tensor 为其他格式,需要更改 dataformats 为对应的格式。

实例:

1
2
3
4
5
6
7
8
9
10
11
from torch.utils.tensorboard import SummaryWriter
import numpy as np

img_batch = np.zeros((16, 3, 100, 100))
for i in range(16):
img_batch[i, 0] = np.arange(0, 10000).reshape(100, 100) / 10000 / 16 * i
img_batch[i, 1] = (1 - np.arange(0, 10000).reshape(100, 100) / 10000) / 16 * i

writer = SummaryWriter()
writer.add_images('my_image_batch', img_batch, 0)
writer.close()

add_figure

将 matplotlib figure 渲染成图片并把它添加到 summary。注意需要安装 matplotlib 包。

add_figure(tag, figure, global_step=None, close=True)

  • tag:数据 ID。
  • figure:figure 或者 figure 列表。
  • global_step:全局的步骤数。

add_graph

将图数据添加到 summary。

add_graph(model, input_to_model=None, verbose=False)

  • model (torch.nn.Module):要画的模型。
  • input_to_model:输入变量。(torch.Tensor 或者 torch.Tensorlist)
  • verbose:是否把图结构输入到控制台。(没啥用, 输出的结果看不懂)

add_hparms

将一组超参数数据添加到 TensorBoard。

add_hparams(hparam_dict, metric_dict, run_name)

  • hparam_dict:字典中每个键值对,超参数和它对应的值。

  • metric_dcit:字典中每个 metric 和它对应的值。注意这里使用的值应该是 tensorboard 记录里唯一的值。(unique)

  • run_name:这次 run 的名称,会被包含在 logdir 文件夹下。如果 run_name 未被指定,则默认会使用当前时间戳。

实例:

1
2
3
4
5
from torch.utils.tensorboard import SummaryWriter
with SummaryWriter() as w:
for i in range(5):
w.add_hparams({'lr': 0.1*i, 'bsize': i},
{'hparam/accuracy': 10*i, 'hparam/loss': 10*i})

数据读取

1
2
3
4
5
6
7
8
9
10
from tensorboard.backend.event_processing import event_accumulator

#加载日志数据
ea=event_accumulator.EventAccumulator('events.out.tfevents.1550994567.vvd-Inspiron-7557')
ea.Reload()
print(ea.scalars.Keys())

val_psnr=ea.scalars.Items('val_psnr')
print(len(val_psnr))
print([(i.step,i.value) for i in val_psnr])

输出:

1
2
3
['val_loss', 'val_psnr', 'loss', 'psnr', 'lr']
29
[(0, 33.70820617675781), (1, 34.52505874633789), (2, 34.26629638671875), (3, 35.47195053100586), (4, 35.45940017700195), (5, 35.336708068847656), (6, 35.467647552490234), (7, 35.919857025146484), (8, 35.29727554321289), (9, 35.63655471801758), (10, 36.219871520996094), (11, 36.178646087646484), (12, 35.93777847290039), (13, 35.587406158447266), (14, 36.198944091796875), (15, 36.241966247558594), (16, 36.379913330078125), (17, 36.28306198120117), (18, 36.03053665161133), (19, 36.20806121826172), (20, 36.21710968017578), (21, 36.42262268066406), (22, 36.00306701660156), (23, 36.4374885559082), (24, 36.163787841796875), (25, 36.53673553466797), (26, 35.99557113647461), (27, 36.96220016479492), (28, 36.63676452636719)]

PyTorch 中 TensorBoard 可视化模块应用
https://pandintelli.github.io/2022/01/18/tensorboard-application-in-PyTorch/
作者
Pand
发布于
2022年1月18日
许可协议