• 文档 >
  • torch.utils.tensorboard
快捷方式

torch.utils.tensorboard

在继续之前,可以在 https://tensorflowcn.cn/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

一个实验可以记录大量信息。为了避免 UI 混乱并更好地对结果进行聚类,我们可以通过分层命名来对绘图进行分组。例如,“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)

预期结果

_images/hier_tags.png


class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[source]

将条目直接写入 log_dir 中的事件文件中,供 TensorBoard 使用。

SummaryWriter 类提供了一个高级 API,用于在给定目录中创建事件文件,并向其中添加摘要和事件。该类异步更新文件内容。这允许训练程序直接从训练循环中调用方法将数据添加到文件中,而不会减慢训练速度。

__init__(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[source]

创建一个 SummaryWriter,它将事件和摘要写入事件文件。

参数
  • log_dir (str) – 保存目录位置。默认为 runs/CURRENT_DATETIME_HOSTNAME,每次运行后都会更改。使用分层文件夹结构可以轻松比较不同运行的结果。例如,对于每个新实验,分别传递 ‘runs/exp1’、‘runs/exp2’ 等,以便在它们之间进行比较。

  • comment (str) – 附加到默认 log_dir 的注释 log_dir 后缀。如果分配了 log_dir,则此参数无效。

  • purge_step (int) – 当在步骤 T+XT+X 发生崩溃并从步骤 TT 重新启动时,任何全局步骤 (global_step) 大于或等于 TT 的事件都将被清除并隐藏在 TensorBoard 中。请注意,崩溃并恢复的实验应具有相同的 log_dir

  • max_queue (int) – 在其中一个“添加”调用强制刷新到磁盘之前,用于挂起的事件和摘要的队列大小。默认值为十个项目。

  • 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)[source]

将标量数据添加到摘要。

参数
  • tag (str) – 数据标识符

  • scalar_value (float字符串/blob名称) – 要保存的值

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

  • new_style (布尔值) – 是否使用新样式(张量字段)或旧样式(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)
writer.close()

预期结果

_images/add_scalar.png
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)[source]

将多个标量数据添加到摘要。

参数
  • main_tag (str) – 标签的父名称

  • tag_scalar_dict (dict) – 存储标签和对应值的键值对

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (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.

预期结果

_images/add_scalars.png
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)[source]

将直方图添加到摘要。

参数

示例

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()

预期结果

_images/add_histogram.png
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')[source]

将图像数据添加到摘要。

请注意,这需要 pillow 包。

参数
  • tag (str) – 数据标识符

  • img_tensor (torch.Tensor, numpy.ndarray字符串/blob名称) – 图像数据

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

  • dataformats (str) – 图像数据格式规范,格式为 CHW、HWC、HW、WH 等。

形状

img_tensor:默认为 (3,H,W)(3, H, W)。您可以使用 torchvision.utils.make_grid() 将一批张量转换为 3xHxW 格式,或调用 add_images 并让我们来完成这项工作。形状为 (1,H,W)(1, H, W)(H,W)(H, W)(H,W,3)(H, W, 3) 的张量也适用,只要传递了相应的 dataformats 参数(例如 CHWHWCHW)。

示例

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()

预期结果

_images/add_image.png
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')[source]

将批处理的图像数据添加到摘要。

请注意,这需要 pillow 包。

参数
  • tag (str) – 数据标识符

  • img_tensor (torch.Tensor, numpy.ndarray字符串/blob名称) – 图像数据

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

  • dataformats (str) – 图像数据格式规范,格式为 NCHW、NHWC、CHW、HWC、HW、WH 等。

形状

img_tensor:默认为 (N,3,H,W)(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()

预期结果

_images/add_images.png
add_figure(tag, figure, global_step=None, close=True, walltime=None)[source]

将 matplotlib 图像渲染成图片并添加到摘要中。

请注意,这需要 matplotlib 包。

参数
  • tag (str) – 数据标识符

  • figure (Union[Figure, List[Figure]]) – 图像或图像列表

  • global_step (Optional[int]) – 要记录的全局步数

  • close (bool) – 自动关闭图像的标志

  • walltime (Optional[float]) – 可选的覆盖默认挂钟时间(time.time()),以事件纪元后的秒数表示

add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[source]

将视频数据添加到摘要中。

请注意,这需要 moviepy 包。

参数
  • tag (str) – 数据标识符

  • vid_tensor (torch.Tensor) – 视频数据

  • global_step (int) – 要记录的全局步骤值

  • fps (float or int) – 每秒帧数

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

形状

vid_tensor: (N,T,C,H,W)(N, T, C, H, W). 值应在 [0, 255](对于 uint8 类型)或 [0, 1](对于 float 类型)范围内。

add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)[source]

将音频数据添加到摘要中。

参数
  • tag (str) – 数据标识符

  • snd_tensor (torch.Tensor) – 音频数据

  • global_step (int) – 要记录的全局步骤值

  • sample_rate (int) – 以赫兹为单位的采样率

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

形状

snd_tensor: (1,L)(1, L). 值应介于 [-1, 1] 之间。

add_text(tag, text_string, global_step=None, walltime=None)[source]

将文本数据添加到摘要中。

参数
  • tag (str) – 数据标识符

  • text_string (str) – 要保存的字符串

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

示例

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)[source]

将图数据添加到摘要中。

参数
  • model (torch.nn.Module) – 要绘制的模型。

  • input_to_model (torch.Tensor or list of 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)[source]

将嵌入投影仪数据添加到摘要中。

参数
  • mat (torch.Tensor or numpy.ndarray) – 矩阵,其中每一行是数据点的特征向量

  • metadata (list) – 标签列表,每个元素将转换为字符串

  • label_img (torch.Tensor) – 与每个数据点对应的图像

  • global_step (int) – 要记录的全局步骤值

  • tag (str) – 嵌入的名称

  • metadata_header (list) – 多列元数据的标题列表。如果给出,则每个元数据必须是具有与标题对应的值的列表。

形状

mat: (N,D)(N, D), 其中 N 是数据数量,D 是特征维度

label_img: (N,C,H,W)(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)[source]

添加精确率召回率曲线。

绘制精确率-召回率曲线可以帮助您了解模型在不同阈值设置下的性能。使用此函数,您需要为每个目标提供真实标签(T/F)和预测置信度(通常是模型的输出)。TensorBoard UI 将允许您交互式地选择阈值。

参数
  • tag (str) – 数据标识符

  • labels (torch.Tensor, numpy.ndarray字符串/blobname) – 真实数据。每个元素的二元标签。

  • predictions (torch.Tensor, numpy.ndarray字符串/blobname) – 元素被分类为真的概率。值应在 [0, 1] 范围内

  • global_step (int) – 要记录的全局步骤值

  • num_thresholds (int) – 用于绘制曲线的阈值数量。

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 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(layout)[source]

通过收集“标量”中的图表标签来创建特殊图表。

注意:此函数每个 SummaryWriter() 对象只能调用一次。

因为它只向 TensorBoard 提供元数据,所以可以在训练循环之前或之后调用此函数。

参数

layout (dict) – {categoryName: charts},其中 charts 也是一个字典 {chartName: ListOfProperties}。ListOfProperties 中的第一个元素是图表的类型(MultilineMargin 中的一个),第二个元素应为包含您在 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)[source]

将网格或 3D 点云添加到 TensorBoard。

可视化基于 Three.js,因此允许用户与渲染的对象进行交互。除了顶点、面等基本定义外,用户还可以进一步提供相机参数、照明条件等。请查看https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene以了解高级用法。

参数
  • tag (str) – 数据标识符

  • vertices (torch.Tensor) – 顶点 3D 坐标列表。

  • colors (torch.Tensor) – 每个顶点的颜色

  • faces (torch.Tensor) – 每个三角形内顶点的索引。(可选)

  • config_dict – 包含 ThreeJS 类名称和配置的字典。

  • global_step (int) – 要记录的全局步骤值

  • walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 walltime (time.time())

形状

vertices: (B,N,3)(B, N, 3). (批次、顶点数、通道)

colors: (B,N,3)(B, N, 3). 对于类型 uint8,值应在 [0, 255] 范围内;对于类型 float,值应在 [0, 1] 范围内。

faces: (B,N,3)(B, N, 3). 对于类型 uint8,值应在 [0, 顶点数] 范围内。

示例

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)[source]

添加一组超参数以在 TensorBoard 中进行比较。

参数
  • hparam_dict (dict) – 字典中的每个键值对是超参数的名称及其对应值。值的类型可以是 boolstringfloatintNone 之一。

  • metric_dict (dict) – 字典中的每个键值对是指标的名称及其对应值。请注意,此处使用的键在 TensorBoard 记录中应唯一。否则,您通过 add_scalar 添加的值将显示在超参数插件中。在大多数情况下,这是不希望的。

  • hparam_domain_discrete – (Optional[Dict[str, List[Any]]]) 包含超参数名称及其所有离散值的可取值的字典

  • run_name (str) – 运行的名称,将作为 logdir 的一部分包含在内。如果未指定,将使用当前时间戳。

  • 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})

预期结果

_images/add_hparam.png
flush()[source]

将事件文件刷新到磁盘。

调用此方法以确保所有挂起的事件都已写入磁盘。

close()[source]

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源