torch.utils.tensorboard
在继续之前,可以访问 https://www.tensorflow.org/tensorboard/ 查找更多关于 TensorBoard 的详细信息。
一旦安装了TensorBoard,这些工具就可以让你将PyTorch模型和指标记录到一个目录中,并在TensorBoard UI中进行可视化。对于PyTorch模型和张量以及Caffe2网络和blob,支持的可视化类型包括标量、图像、直方图、图形和嵌入式数据。
SummaryWriter 类是您记录将被 TensorBoard 消费和可视化数据的主要入口。例如:
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)) grid = torchvision.utils.make_grid(images) writer.add_image('images', grid, 0) writer.add_graph(model, images) writer.close()
然后可以使用 TensorBoard 进行可视化,TensorBoard 可以通过以下命令进行安装和运行:
pip install tensorboard tensorboard --logdir=runs
一个实验可以记录大量信息。为了避免界面混乱,并更好地对结果进行分类,我们可以通过层次命名来分组图表。“Loss/train”和“Loss/test”会被归为一组,而“Accuracy/train”和“Accuracy/test”则会在TensorBoard界面上分别单独分组。
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)
预期结果:

- classtorch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[源代码]
-
直接将条目写入日志目录中的事件文件,供TensorBoard读取。
SummaryWriter 类提供了一个高级 API,用于在指定目录中创建事件文件,并向其中添加摘要和事件。该类异步更新文件内容,因此训练程序可以直接从训练循环调用方法将数据写入文件,而不会影响训练速度。
- __init__(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[源代码]
-
创建一个SummaryWriter,用于将事件和摘要写入事件文件。
- 参数
-
-
log_dir (str) – 保存日志的目录位置,默认为 runs/CURRENT_DATETIME_HOSTNAME,每次运行后会自动更新。建议使用层次分明的文件结构来方便不同实验之间的比较。例如,对于每个新实验可以分别设置 ‘runs/exp1’、‘runs/exp2’ 等。
-
comment (str) – 作为默认
log_dir
的注释后缀。如果已设置log_dir
,此参数将无效。 -
purge_step (int) – 当日志记录在步骤$T+X$时崩溃,并从步骤$T$重新开始时,所有全局步数大于或等于$T$的事件将被清除并隐藏在TensorBoard中。请注意,崩溃后恢复的实验应使用相同的
log_dir
。 -
max_queue (int) – 待处理事件和摘要的队列大小,在“add”调用强制执行磁盘刷新之前。默认值为10个项目。
-
flush_secs (int) – 指定每隔多少秒(以秒为单位)将待处理的事件和摘要刷新到磁盘。默认值是每两分钟。
-
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") # 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/
- add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)[源代码]
-
向摘要中添加标量数据。
- 参数
示例:
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(main_tag, tag_scalar_dict, global_step=None, walltime=None)[源代码]
-
向总结中添加许多标量数据。
- 参数
示例:
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.
预期结果:
- add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)[源代码]
-
将直方图添加到总结中。
- 参数
-
-
tag (str) – 用于表示数据的标识符
-
values (torch.Tensor, numpy.ndarray, 或 string/blobname) – 构建直方图的值
-
global_step (int) – 全局步骤的记录值
-
bins (str) – 可选值之一 {‘tensorflow’,’auto’, ‘fd’, …}。这决定了 bins 的创建方式。你可以在以下链接找到其他选项:https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数
-
示例:
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(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')[源代码]
-
将图像数据添加到概要中。
请注意,这需要
pillow
包。- 参数
-
-
tag (str) – 用于表示数据的标识符
-
img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 图像数据
-
global_step (int) – 全局步骤的记录值
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数 -
dataformats (str) – 图像的数据格式规范,例如 CHW、HWC、HW、WH 等。
-
- 形状:
-
img_tensor: 默认为$(3, H, W)$。你可以使用
torchvision.utils.make_grid()
将一批张量转换成3xHxW格式,或者调用add_images
并让我们来处理。此外,张量也可以是$(1, H, W)$、$(H, W)$或$(H, W, 3)$格式,只要相应的dataformats
参数被正确传递即可,例如CHW
、HWC
或HW
。
示例:
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(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')[源代码]
-
将批量图像数据添加到汇总中。
请注意,这需要
pillow
包。- 参数
-
-
tag (str) – 用于表示数据的标识符
-
img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 图像数据
-
global_step (int) – 全局步骤的记录值
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数 -
dataformats (str) – 图像数据格式规范,例如 NCHW、NHWC、CHW、HWC、HW、WH 等。
-
- 形状:
-
img_tensor: 默认格式为$(N, 3, H, W)$。如果指定了
dataformats
参数,也可以接受其他形状的输入,例如 NCHW 或 NHWC。
示例:
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(tag, figure, global_step=None, close=True, walltime=None)[源代码]
-
将 matplotlib 图形渲染为图像,并添加到摘要中。
请注意,这需要
matplotlib
包。
- add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[源代码]
-
将视频数据添加到总结中。
请注意,这需要
moviepy
包。- 参数
- 形状:
-
vid_tensor: $(N, T, C, H, W)$. 类型为uint8的值应位于[0, 255]范围内,类型为float的值应位于[0, 1]范围内。
- add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)[源代码]
-
将音频数据加入到摘要中。
- 参数
-
-
tag (str) – 用于表示数据的标识符
-
snd_tensor (torch.Tensor) – 表示声音的数据
-
global_step (int) – 全局步骤的记录值
-
sample_rate (int) – 采样率(单位:Hz)
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数
-
- 形状:
-
snd_tensor: $(1, L)$。值应位于[-1, 1]范围内。
- add_text(tag, text_string, global_step=None, walltime=None)[源代码]
-
将文本数据添加到总结中。
- 参数
示例:
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) – 要绘制的模型。
-
input_to_model (torch.Tensor 或 列表 包含 torch.Tensor) – 输入到模型的变量或变量元组。
-
verbose (bool) – 是否在控制台打印图形结构。
-
use_strict_trace (bool) – 是否将关键字参数 strict 传递给 torch.jit.trace。如果你希望记录可变容器类型(如列表和字典),请传入 False。
-
- add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)[源代码]
-
将嵌入式投影数据添加到摘要中。
- 参数
-
-
mat (torch.Tensor 或 numpy.ndarray) – 每行表示一个数据点的特征向量的矩阵
-
metadata (列表) — 一个标签列表,每个元素都将被转换为字符串。
-
label_img (torch.Tensor) – 对应每个数据点的图像
-
global_step (int) – 全局步骤的记录值
-
tag (str) – 嵌入的名字
-
metadata_header (列表) – 表示多列元数据的头部信息。如果提供,每个元数据项必须是一个与头部对应的值的列表。
-
- 形状:
-
mat: $(N, D)$,其中 N 表示数据数量,D 表示特征维度
label_img: $(N, C, H, W)$
示例:
import keyword import torch meta = [] while len(meta)<100: meta = meta+keyword.kwlist # get some strings meta = meta[:100] for i, v in enumerate(meta): meta[i] = v+str(i) label_img = torch.rand(100, 3, 10, 32) for i in range(100): label_img[i]*=i/100.0 writer.add_embedding(torch.randn(100, 5), metadata=meta, label_img=label_img) writer.add_embedding(torch.randn(100, 5), label_img=label_img) writer.add_embedding(torch.randn(100, 5), metadata=meta)
注意
类别型(即非数值型)元数据如果用于嵌入投影器的着色,最多只能有50个独特的值。
- add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)[源代码]
-
添加精准率召回曲线。
绘制精确率-召回率曲线可以帮助你了解模型在不同阈值设置下的表现。使用此函数时,你需要提供每个目标的真实标签(真/假)以及预测置信度(通常是模型的输出)。TensorBoard 用户界面将允许你交互式地选择阈值。
- 参数
-
-
tag (str) – 用于表示数据的标识符
-
labels (torch.Tensor、numpy.ndarray 或 string/blobname) – 真实数据。每个元素的二进制标签。
-
predictions (torch.Tensor, numpy.ndarray, 或 string/blobname) – 元素被分类为真的概率值,范围应在 [0, 1] 内。
-
global_step (int) – 全局步骤的记录值
-
num_thresholds (int) – 绘制曲线所使用的阈值的数量。
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数
-
示例:
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_custom_scalars(布局)[源代码]
-
通过在“scalars”中收集图表标签来创建特殊图表。
注意:每个 SummaryWriter() 对象只能调用一次此函数。
由于它仅向 TensorBoard 提供元数据,因此该函数可以在训练循环之前或之后调用。
- 参数
-
layout (字典) – {categoryName: charts},其中charts也是一个字典{chartName: ListOfProperties}。在ListOfProperties中,第一个元素是图表的类型(Multiline 或 Margin 中的一个),第二个元素是一个包含你在add_scalar函数中使用的标签的列表,这些标签将被收集到新的图表中。
示例:
layout = {'Taiwan':{'twse':['Multiline',['twse/0050', 'twse/2330']]}, 'USA':{ 'dow':['Margin', ['dow/aaa', 'dow/bbb', 'dow/ccc']], 'nasdaq':['Margin', ['nasdaq/aaa', 'nasdaq/bbb', 'nasdaq/ccc']]}} writer.add_custom_scalars(layout)
- add_mesh(tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None)[源代码]
-
在TensorBoard中添加网格或三维点云。
该可视化基于 Three.js,允许用户与渲染的对象进行交互。除了顶点和面等基本定义外,用户还可以提供相机参数、光照条件等。请参阅 https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene 以了解高级用法。
- 参数
-
-
tag (str) – 用于表示数据的标识符
-
vertices (torch.Tensor) – 顶点的三维坐标列表。
-
colors (torch.Tensor) – 为每个顶点指定的颜色
-
faces (torch.Tensor) – 指定每个三角形内部的顶点索引。(可选)
-
config_dict – 一个包含 ThreeJS 类名和配置的字典。
-
global_step (int) – 全局步骤的记录值
-
walltime (float) – 可选的覆盖默认walltime(以
time.time()
为准),事件发生后的秒数
-
- 形状:
-
顶点:$(B, N, 3)$。(批次,顶点数量,通道数)
colors: $(B, N, 3)$. 值应为uint8类型时在[0, 255]之间,或为float类型时在[0, 1]之间。
faces: $(B, N, 3)$。值的范围应在[0, number_of_vertices]之间,类型为uint8。
示例:
from torch.utils.tensorboard import SummaryWriter vertices_tensor = torch.as_tensor([ [1, 1, 1], [-1, -1, 1], [1, -1, -1], [-1, 1, -1], ], dtype=torch.float).unsqueeze(0) colors_tensor = torch.as_tensor([ [255, 0, 0], [0, 255, 0], [0, 0, 255], [255, 0, 255], ], dtype=torch.int).unsqueeze(0) faces_tensor = torch.as_tensor([ [0, 2, 3], [0, 3, 1], [0, 1, 2], [1, 3, 2], ], dtype=torch.int).unsqueeze(0) writer = SummaryWriter() writer.add_mesh('my_mesh', vertices=vertices_tensor, colors=colors_tensor, faces=faces_tensor) writer.close()
- add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None, global_step=None)[源代码]
-
在TensorBoard中添加一组需要比较的超参数。
- 参数
-
-
hparam_dict (dict) – 字典中的每个键值对包含一个超参数的名称及其对应的值。值的类型可以是bool、string、float、int 或 None。
-
metric_dict (dict) – 字典中的每个键值对包含一个指标的名称及其对应的值。需要注意的是,这里的键在 tensorboard 记录中必须是唯一的;否则,通过
add_scalar
添加的值将会出现在 hparam 插件中。通常情况下,这是不需要的。 -
hparam_domain_discrete – (可选[字典[str, 列表[Any]]])一个包含超参数名称及其所有离散值的字典
-
run_name (str) – 运行的名称,将作为日志目录的一部分。如果未指定,默认使用当前时间戳。
-
global_step (int) – 全局步骤的记录值
-
示例:
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})
预期结果:
- flush()[源代码]
-
将事件文件写入磁盘。
调用此方法以确保所有 pending 事件已保存到磁盘。
- close()[源代码]