torch.utils.tensorboard使用记录

  • 初始化
  • SummaryWriter常用的几种功能方法
  • 记录标量/添加标量
  • 一次记录多种标签/标量值
  • 添加图片数据,需要pillow包
  • 添加批量图片
  • 添加文本数据
  • 添加模型结构数据
  • 添加pr曲线
  • 添加超参数
  • 可视化界面启动


初始化

torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment=‘’, purge_step=None, max_queue=10, flush_secs=120, filename_suffix=‘’)

  • init(log_dir=None, comment=‘’, purge_step=None, max_queue=10, flush_secs=120, filename_suffix=‘’)
  • log_dir(str)–文件保存路径;使用默认进行项目记录时,生成的路径名为runs/CurrentDatetime+HOSRTNAME(当前时间+设备名称),在每次run时都会自动改变。使用分层的文件夹可以较好的记录不同实现,如指定runs/exp1,runs/exp2,这两个目录可以很好的把不同实验分开
  • comment(str)–如果没有指定log_dir,其会作为后缀附加到默认路径名后面,如果指定了log_dir,其会失效
  • purge_step(int)–TensorBoard在记录数据的时候有可能会崩溃,例如在某一个epoch中,进行到第T + X个step的时候由于各种原因(内存溢出)导致崩溃,那么当服务重启之后,就会从T 个step重新开始将数据写入文件,而中间的X,即purge_step指定的step内的数据都被丢弃
  • max_queue(int)–在记录数据的时候,在内存中开的队列的长度,当队列慢了之后就会把数据写入磁盘(文件)中
  • flush_secs(int)–以秒为单位的写入磁盘的间隔,默认是120秒,即两分钟
  • filename_suffix(str)–添加到log_dir中每个文件的后缀。更多文件名称设置要参考tensorboard.summary.writer.event_file_writer.EventFileWriter类

代码案例:

from torch.utils.tensorboard import SummaryWriter

# create a summary writer with automatically generated folder name.
writer = SummaryWriter()  # 默认方法,不传参数
# folder location: runs/May04_22-14-54_s-MacBook-Pro.local/

# create a summary writer using the specified folder name.
writer = SummaryWriter("my_experiment")  # 相当于把前面说的runs替换为指定的my_experiment
# folder location: my_experiment

# create a summary writer with comment appended.
writer = SummaryWriter(comment="LR_0.1_BATCH_16")
# folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/

SummaryWriter常用的几种功能方法

记录标量/添加标量

add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)

  • tag(str)–用于给数据进行分类的标签,标签中可以包含父级和子级标签。例如给训练的loss以loss/train的tag,而给验证以loss/val的tag,这样的话,最终的效果就是训练的loss和验证的loss都被分到loss这个父级标签下。而train和val则是具体用于区分两个参数的标识符(identifier)。此外,只支持到二级标签
  • scalar_value(float or string/blobname)–需要记录或保存的参数值/标量
  • global_step(int)–首先,每个epoch中我们都会更新固定的step。因此,在一个数据被加入的时候,有两种step,第一种step是数据被加入时当前epoch已经进行了多少个step,第二种step是数据被加入时候,累计(包括之前的epoch)已经进行了多少个step。而考虑到我们在绘图的时候往往是需要观察所有的step下的数据的变化,因此global_step指的就是当前数据被加入的时候已经计算了多少个step。计算global_step的步骤很简单,就是global_step = epoch ∗ len(dataloader) + current_step
  • new_style(boolean)–是使用新样式(张量字段)还是旧样式(simple_value 字段)。新样式可能会导致更快的数据加载

代码案例:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
    writer.add_scalar('y=2x', i * 2, i)  # 此处的i就时global_step
writer.close()  # 关闭

一次记录多种标签/标量值

add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)

  • mian_tag(string)–所有要记录的标签的父名称
  • tag_scalar_dict(dict)–多个表情名和对应的值组成的标量字典,key是记录的表明的名称,value是对应标量每个step的值
  • global_step(int)–如上述
  • walltime(float)–从SummaryWriter实例化开始到当前数据被加入时候所经历时间(以秒计算),默认是使用time.time()来自动计算的,当然我们也可以指定这个参数来进行修改。这个参数一般不改

代码案例:

from torch.utils.tensorboard import SummaryWriter
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()  # 关闭
# This call adds three values to the same scalar plot with the tag
# 'run_14h' in TensorBoard's scalar section.

添加图片数据,需要pillow包

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

  • tag(string)–如上述
  • img_tensor(torch.Tensor, numpy.array, or string/blobname)–需要记录的图片的数据
    - shape:默认是(3, H, W)。可以使用torchvision.utils.make_grid()将一批张量转换为3xHxW 格式或调用add_images。具有 (1, H, W), (H,W), (H, W, 3) 的张量也适用,只要设置对应的数据格式参数即可例如CHW,HWC,HW。
  • global_step(int)–如上述
  • walltime(float)–如上述
  • dataformats(str)–表格的图像数据格式规范,如CHW, HWC, HW, WH等,默认是CHW

代码案例:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
img = np.zeros((3, 100, 100))  # 默认格式,CHW
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))  # 非默认格式,HWC
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')  # 非默认格式要设置dataformats为对应格式
writer.close()

添加批量图片

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

  • tag(string)–如上述
  • img_tensor(torch.Tensor, numpy.array, or string/blobname)–需要记录的图片的数据
    - shape:默认是(N,3, H, W)。当传入数据为非默认形状时,需要将dataformats设置为对应的格式
  • global_step(int)–如上述
  • walltime(float)–如上述
  • dataformats(str)–表格的图像数据格式规范,如NCHW, NHWC, CHW, WH等,默认是NCHW

代码案例:

from torch.utils.tensorboard import SummaryWriter
import numpy as np

img_batch = np.zeros((16, 3, 100, 100))  # 生成了默认格式(N,3, H, W)的图片数据
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_text(tag, text_string, global_step=None, walltime=None)

  • tag(str)–如上述
  • text_string(str)–需要记录的文本字符串
  • global_step(int)–如上述
  • walltime(float)–如上述

代码案例:

writer.add_text('lstm', 'This is an lstm', 0)
writer.add_text('rnn', 'This is an rnn', 10)

添加模型结构数据

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

  • model(torch.nn.Module)–需要绘制的模型,必须是继承nn.Module的模型
  • input_to_model(torch.Tensor or list of torch.Tensor)–待输入神经网络的变量或一组变量。输入的是一个元组,且各变量的维度一定要满足网络的实际输入需求,因为网络的输入变量个数大于等于1
  • verbose(bool)–是否在控制台打印图形结构
  • use_strict_trace(bool)–是否将关键字参数严格传递给 torch.jit.trace。当您希望跟踪器记录您的可变容器类型(列表、字典)时,传递 False

添加pr曲线

添加精确召回曲线。绘制精确召回曲线可让您了解模型在不同阈值设置下的性能。使用此功能,您可以为每个目标提供真实标记 (T/F) 和预测置信度(通常是模型的输出)。 TensorBoard UI 将让您以交互方式选择阈值。
add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)

  • tag(str)–如上述
  • labels(torch.Tensor, numpy.array, or string/blobname)–真实labels。每个元素的二元标签。
  • predictions(torch.Tensor, numpy.array, or string/blobname)–元素被分类为真的概率。值应该在 [0, 1]
  • global_step(int)–如上述
  • num_thresholds(int)–用于绘制曲线的阈值数
  • walltime(float)–如上述

代码案例:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
labels = np.random.randint(2, size=100)  # binary label
predictions = np.random.rand(100)
writer = SummaryWriter()
writer.add_pr_curve('pr_curve', labels, predictions, 0)
writer.close()

添加超参数

add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None)

  • hparam_dict(dict)–存放超参数的字典,字典中的每个键值对都是超参数的名称及其对应的值。值的类型可以是 bool、string、float、int 或 None 之一。
  • metric_dict(dict)–字典中的每个键值对都是度量的名称及其对应的值。注意这里使用的键在tensorboard记录中应该是唯一的。否则,您通过 add_scalar 添加的值将显示在 hparam 插件中。在大多数情况下,这是不需要的。
  • hparam_domain_discrete(Optional[Dict[str, List[Any]]])–包含超参数名称和它们可以保存的所有离散值的字典
  • run_name(str)–运行的名称,作为 logdir 的一部分包含。如果未指定,将使用当前时间戳

代码案例:

from torch.utils.tensorboard import SummaryWriter
with SummaryWriter() as w:
    for i in range(5):  # 每次超参数随着i变化
        w.add_hparams({'lr': 0.1*i, 'bsize': i},
                      {'hparam/accuracy': 10*i, 'hparam/loss': 10*i})

对于add_hparams,最好是在模型完成训练时,使用模型对训练集、验证集、测试集计算完accuracy、loss等metric后再将本次训练的有些超参数一起保存,并且此处的metric中的名称要与前面add_scalar中的不同

可视化界面启动

在算法训练完毕后,会在项目目录下生成在初始化中指定的log_dir的路径,在终端输入tensorboard --logdir=路径名,用浏览器访问http://127.0.0.1:6006即可进入可视化界面

tensorboard会在你指定的这个log-dir里面做路径搜索,寻找所有的events文件以及子文件夹中的events文件。路径相同的events文件可视化的图形线条颜色一样,如果文件路径不同但是数据名称相同,则会被用不同线条颜色画到同一个图里面。

pytorch官方文档连接https://pytorch.org/docs/stable/tensorboard.html,其中还有很多其他的方法