在 Pytorch 中使用 Tensorboard 进行可视化

王 茂南 2022年1月20日07:14:15
评论
2 4384字阅读14分36秒
摘要本文主要是介绍如何使用 Pytorch 结合 Tensorboard 对训练过程进行可视化。主要介绍以下的几个功能,向 Tensorboard 添加单个或是多个指标,向 Tensorboard 添加图像,向 Tensorboard 添加模型。

简介

在模型的训练过程中,我们通常会打印许多的统计值来告诉我们训练得怎么样。除了输出为日志之外,我们可以使用 Tensorboard 来做得更好。本文主要是介绍如何使用 Pytorch 结合 Tensorboard 对训练过程进行可视化。

参考资料

 

Tensorboard 使用指南

Tensorboard 添加单个指标

我们可以在 torch.utils 中来 import tensorboard,接着定义一个 SummaryWriter 来将信息写入 Tensorboard

下面来看一个简单的例子,甚至没有「神经网络」,我们使用 Tensorboard 记录一些数字。我们定义了 sincostan 三个函数。现在通过 add_scalar 来将信息记录在 Tensorboard 中。add_scalar 中输入的值为,「变量的名称,变量的值,当前迭代的次数」:

  1. import math
  2. import random
  3. from torch.utils.tensorboard import SummaryWriter
  4. for i in range(3):
  5.     writer = SummaryWriter(log_dir='./runs/lr_{}'.format(i)) # create a writer
  6.     funcs = {"sin": math.sin, "cos": math.cos, "tan": math.tan}
  7.     for angle in range(-360, 360):
  8.         angle_rad = angle * math.pi / 180
  9.         for name, fun in funcs.items():
  10.             val = fun(angle_rad) + random.randint(0, 2-i) # i 越大随机性越小
  11.             # name of parameter, its value, current iteration
  12.             writer.add_scalar(name, val, angle)
  13.     writer.close()

运行上面的代码,会生产一个 runs 的文件夹,runs 文件夹下会有三个子文件夹,分别是 lr_0lr_1lr_2。接着在终端运行下面的命令,接着点击地址 http://localhost:6006/ 即可查看:

  1. tensorboard --logdir=runs

对于上面的结果,我们可以看到如下所示的结果:

在 Pytorch 中使用 Tensorboard 进行可视化

 

Tensorboard 添加多个指标

如果我们想把上面的 sincostan 三个函数的结果记录在一个图像上,我们可以使用 add_scalars 来进行记录,下面是一个简答的例子:

  1. import math
  2. import random
  3. from torch.utils.tensorboard import SummaryWriter
  4. for i in range(3):
  5.     writer = SummaryWriter(log_dir='./runs/lr_{}'.format(i)) # create a writer
  6.     funcs = {"sin": math.sin, "cos": math.cos, "tan": math.tan}
  7.     for angle in range(-360, 360):
  8.         angle_rad = angle * math.pi / 180
  9.         # name of parameter, its value, current iteration
  10.         writer.add_scalars('run_test',
  11.                             {
  12.                                 'sin':funcs['sin'](angle_rad)+random.randint(0, 2-i),
  13.                                 'cos':funcs['cos'](angle_rad)+random.randint(0, 2-i),
  14.                                 'tan':funcs['tan'](angle_rad)+random.randint(0, 2-i)
  15.                             },
  16.                             angle)
  17.     writer.close()

最终的结果如下图所示,可以看到一共运行了 3 次,每次包含 3 个函数的结果在一张图上:

在 Pytorch 中使用 Tensorboard 进行可视化

 

Tensorboard 添加直方图

除了添加单个指标绘制为折线图之外,我们一次可以添加多个值从而绘制直方图(可以用来查看分布)。下面是一个简单的例子,我们添加 10 次,每次的均值 +1:

  1. import numpy as np
  2. import random
  3. from torch.utils.tensorboard import SummaryWriter
  4. writer = SummaryWriter()
  5. for i in range(10):
  6.     x_random = np.array([random.random()+i for _ in range(1000)]) # 一组 1000 个随机数
  7.     writer.add_histogram('distribution centers', x_random, i)
  8. writer.close()

运行上面代码,最终的结果如下图所示:

在 Pytorch 中使用 Tensorboard 进行可视化

 

Tensorboard 记录图片

除了记录数据之外,我们还可以向 Tensorboard 中添加图片。如果是 matplotlib 的图片使用 add_figure;如果是 pillow 的图片(或是 numpy 的数据),我们使用 add_image

首先看一个使用 add_image 来添加图片,我们一共添加了 16 张图片:

  1. from torch.utils.tensorboard import SummaryWriter
  2. writer = SummaryWriter()
  3. for i in range(16):
  4.     img_batch = np.zeros((3, 100, 100))
  5.     img_batch[0] = np.arange(0, 10000).reshape(100, 100) / 10000 / 16 * i
  6.     img_batch[1] = (1 - np.arange(0, 10000).reshape(100, 100) / 10000) / 16 * i
  7.     writer.add_image('my_image', img_batch, i)
  8. writer.close()

最终的效果如下图所示,我们可以拖动小圆点从而显示不同 step 的结果:

在 Pytorch 中使用 Tensorboard 进行可视化

如果想要同时添加多张图片也是一样的,使用 add_image。下面是添加多张的实例代码(下面的 image_batch 是有一个 batch_size 的维度的,上面的 add_image 是只有三维):

  1. img_batch = np.zeros((16, 3, 100, 100))
  2. for i in range(16):
  3.     img_batch[i, 0] = np.arange(0, 10000).reshape(100, 100) / 10000 / 16 * i
  4.     img_batch[i, 1] = (1 - np.arange(0, 10000).reshape(100, 100) / 10000) / 16 * i
  5. writer = SummaryWriter()
  6. writer.add_images('my_image_batch', img_batch, 0)
  7. writer.close()

 

Tensorboard 添加模型

我们还可以将模型添加到 Tensorboard 中,从而很方便的查看模型的结构。在下面的例子中,我们首先初始化一个网络,接着随机一个输入,最后使用 add_graph 将网络加入 tensorboard

  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. from torch.utils.tensorboard import SummaryWriter
  5. class Net(nn.Module):
  6.     def __init__(self):
  7.         super(Net, self).__init__()
  8.         self.conv1 = nn.Conv2d(1, 6, 5)
  9.         self.pool = nn.MaxPool2d(2, 2)
  10.         self.conv2 = nn.Conv2d(6, 16, 5)
  11.         self.fc1 = nn.Linear(16 * 4 * 4, 120)
  12.         self.fc2 = nn.Linear(120, 84)
  13.         self.fc3 = nn.Linear(84, 10)
  14.     def forward(self, x):
  15.         x = self.pool(F.relu(self.conv1(x)))
  16.         x = self.pool(F.relu(self.conv2(x)))
  17.         x = x.view(-1, 16 * 4 * 4)
  18.         x = F.relu(self.fc1(x))
  19.         x = F.relu(self.fc2(x))
  20.         x = self.fc3(x)
  21.         return x
  22. net = Net() # 初始化网络
  23. x_input = torch.rand(1, 1, 28, 28) # 随机一个 input
  24. # 写入 tensorboard
  25. writer = SummaryWriter()
  26. writer.add_graph(net, x_input)
  27. writer.close()

最终的结果如下图所示,我们可以双击 Net 查看具体的细节(这里因为展开之后太大,所以我们就不放展开之后的图片了),放大查看每一层输入和输出的数据维度:

在 Pytorch 中使用 Tensorboard 进行可视化

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2022年1月20日07:14:15
  • 转载请务必保留本文链接:https://mathpretty.com/14444.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: