快捷方式

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) – 等待事件和摘要的队列大小,在其中一个“add”调用强制将数据刷新到磁盘之前。默认值为十项。

  • 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) – 可选地使用事件的纪元后秒数覆盖默认的挂钟时间(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) – 可选的覆盖默认墙上时间(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) – 可选的覆盖默认墙上时间(time.time()),事件发生后的秒数

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

形状

img_tensor: Default is (3,H,W)(3, H, W). You can use torchvision.utils.make_grid() to convert a batch of tensor into 3xHxW format or call add_images and let us do the job. Tensor with (1,H,W)(1, H, W), (H,W)(H, W), (H,W,3)(H, W, 3) is also suitable as long as corresponding dataformats argument is passed, e.g. 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()

预期结果

_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) – 可选的覆盖默认墙上时间(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]) – 可选的覆盖默认的 walltime(事件发生后经过的秒数,以 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) – 可选的覆盖默认墙上时间(time.time()),事件发生后的秒数

形状

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

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) – 可选的覆盖默认墙上时间(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) – 可选的覆盖默认墙上时间(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.Tensornumpy.ndarray) – 矩阵,其中每一行都是数据点的特征向量

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

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

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

  • tag (str) – 嵌入的名称

形状

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)
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) – 真实数据。每个元素的二进制标签。

  • 预测值 (torch.Tensor, numpy.ndarray, 或 字符串/blob名称) – 元素被分类为真的概率。值应在 [0, 1] 之间

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

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

  • walltime (float) – 可选的覆盖默认墙上时间(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]

通过收集 'scalars' 中的图表标签来创建特殊图表。

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

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

参数

布局 (dict) – {类别名称: 图表},其中 图表 也是一个字典 {图表名称: 属性列表}。属性列表 中的第一个元素是图表的类型(多线边距 之一),第二个元素应该是包含您在 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]

在 TensorBoard 中添加网格或 3D 点云。

可视化基于 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) – 可选的覆盖默认墙上时间(time.time()),事件发生后的秒数

形状

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

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

面部:(B,N,3)(B, N, 3). 对于类型 uint8,值应在 [0, number_of_vertices] 范围内。

示例

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 插件中。在大多数情况下,这是不希望的。

  • hparam_domain_discrete – (Optional[Dict[str, List[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})

预期结果

_images/add_hparam.png
flush()[source]

将事件文件刷新到磁盘。

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

close()[source]

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源