torch.utils.tensorboard¶
在深入了解之前,关于 TensorBoard 的更多详细信息可以在 https://tensorflowcn.cn/tensorboard/ 找到
一旦您安装了 TensorBoard,这些实用程序允许您将 PyTorch 模型和指标记录到一个目录中,以便在 TensorBoard UI 中进行可视化。标量、图像、直方图、图表和嵌入可视化都支持 PyTorch 模型和张量以及 Caffe2 网络和 blobs。
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)
预期结果

- class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[源代码][源代码]¶
将条目直接写入 log_dir 中的事件文件,以供 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 后缀。如果分配了log_dir
,则此参数无效。purge_step (int) – 当日志记录在步骤 崩溃并在步骤 重新启动时,global_step 大于或等于 的任何事件将被清除并从 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)[源代码][源代码]¶
向摘要添加标量数据。
- 参数
示例
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.cn/doc/numpy/reference/generated/numpy.histogram.html
walltime (float) – 可选的覆盖默认 walltime (time.time()),单位为事件的 epoch 后的秒数
示例
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()),单位为事件的 epoch 后的秒数
dataformats (str) – 图像数据格式规范,形式为 CHW、HWC、HW、WH 等。
- 形状
img_tensor: 默认为 。 您可以使用
torchvision.utils.make_grid()
将一批张量转换为 3xHxW 格式,或调用add_images
并让我们完成这项工作。 具有 、 、 的张量也适用,只要传递相应的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()),单位为事件的 epoch 后的秒数
dataformats (str) – 图像数据格式规范,形式为 NCHW、NHWC、CHW、HWC、HW、WH 等。
- 形状
img_tensor: 默认为 。 如果指定了
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: 。 对于 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()),单位为事件的 epoch 后的秒数
- 形状
snd_tensor: 。 值应介于 [-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 或 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][source]¶
向 summary 添加嵌入投影仪数据。
- 参数
mat (torch.Tensor 或 numpy.ndarray) – 矩阵,其中每一行是数据点的特征向量
metadata (list) – 标签列表,每个元素将被转换为字符串
label_img (torch.Tensor) – 与每个数据点对应的图像
global_step (int) – 要记录的全局步数值
tag (str) – 嵌入的名称
metadata_header (list) – 多列元数据的标题列表。 如果给定,则每个元数据必须是包含与标题对应的值的列表。
- 形状
mat: ,其中 N 是数据点的数量,D 是特征维度
label_img:
示例
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][source]¶
添加精确率-召回率曲线。
绘制精确率-召回率曲线可让您了解模型在不同阈值设置下的性能。 使用此函数,您可以为每个目标提供真实标签 (T/F) 和预测置信度(通常是模型的输出)。 TensorBoard UI 将允许您以交互方式选择阈值。
- 参数
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()),单位为事件的 epoch 后的秒数
示例
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][source]¶
通过收集 'scalars' 中的图表标签来创建特殊图表。
注意:此函数对于每个 SummaryWriter() 对象只能调用一次。
因为它只向 tensorboard 提供元数据,所以该函数可以在训练循环之前或之后调用。
- 参数
layout (dict) – {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)[source][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) – 可选的覆盖默认 walltime (time.time()),单位为事件的 epoch 后的秒数
- 形状
vertices: 。(批次大小,顶点数,通道数)
colors: 。 对于 uint8 类型,值应在 [0, 255] 范围内;对于 float 类型,值应在 [0, 1] 范围内。
faces: 。 对于 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][source]¶
向 TensorBoard 添加一组超参数以进行比较。
- 参数
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 中。 如果未指定,将使用当前时间戳。
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})
预期结果