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)
预期结果
- 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) – 当在步骤 发生崩溃并从步骤 重新启动时,任何全局步骤 (global_step) 大于或等于 的事件都将被清除并隐藏在 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]¶
将标量数据添加到摘要。
- 参数
示例
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)[source]¶
将多个标量数据添加到摘要。
- 参数
示例
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)[source]¶
将直方图添加到摘要。
- 参数
tag (str) – 数据标识符
values (torch.Tensor, numpy.ndarray 或 字符串/blob名称) – 用于构建直方图的值
global_step (int) – 要记录的全局步骤值
bins (str) – {‘tensorflow’,’auto’, ‘fd’, …} 之一。这决定了箱子的制作方式。您可以在以下位置找到其他选项:https://docs.scipy.org.cn/doc/numpy/reference/generated/numpy.histogram.html
walltime (float) – 可选地使用 epoch 后的秒数(事件的时间戳)覆盖默认的 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')[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:默认为 。您可以使用
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')[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:默认为 。如果指定了
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)[source]¶
将 matplotlib 图像渲染成图片并添加到摘要中。
请注意,这需要
matplotlib
包。
- add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[source]¶
将视频数据添加到摘要中。
请注意,这需要
moviepy
包。- 参数
- 形状
vid_tensor: . 值应在 [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, 1] 之间。
- add_text(tag, text_string, global_step=None, walltime=None)[source]¶
将文本数据添加到摘要中。
- 参数
示例
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 是特征维度
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]¶
添加精确率召回率曲线。
绘制精确率-召回率曲线可以帮助您了解模型在不同阈值设置下的性能。使用此函数,您需要为每个目标提供真实标签(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 中的第一个元素是图表的类型(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]¶
将网格或 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: . (批次、顶点数、通道)
colors: . 对于类型 uint8,值应在 [0, 255] 范围内;对于类型 float,值应在 [0, 1] 范围内。
faces: . 对于类型 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) – 字典中的每个键值对是超参数的名称及其对应值。值的类型可以是 bool、string、float、int 或 None 之一。
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})
预期结果