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) – 当记录在步骤 处崩溃并从步骤 处重新启动时,任何全局步骤大于或等于 的事件将被清除并从 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]¶
将标量数据添加到摘要。
- 参数
示例
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) – 可选地覆盖默认的 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) – 可选地覆盖默认的 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) – 可选地覆盖默认的 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)[源代码]¶
将视频数据添加到摘要。
请注意,这需要
moviepy
包。- 参数
- 形状
vid_tensor: . 值应在 [0, 255] 之间,类型为 uint8 或 [0, 1] 之间,类型为 float。
- add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)[源代码]¶
将音频数据添加到摘要。
- 参数
tag (str) – 数据标识符
snd_tensor (torch.Tensor) – 音频数据
global_step (int) – 要记录的全局步长值
sample_rate (整数) – 采样率,以赫兹为单位
walltime (float) – 可选地覆盖默认的 walltime (time.time()),使用事件的纪元后秒数
- 形状
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 或 列表 的 torch.Tensor) – 要馈送的变量或变量元组。
verbose (布尔值) – 是否在控制台中打印图形结构。
use_strict_trace (布尔值) – 是否将关键字参数 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 (字符串) – 嵌入的名称
metadata_header (列表) – 多列元数据的标题列表。如果给出,每个元数据都必须是一个列表,其值对应于标题。
- 形状
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)[源代码]¶
添加精确率-召回率曲线。
绘制精确率-召回率曲线可以帮助您了解模型在不同阈值设置下的性能。使用此功能,您需要为每个目标提供真实标签(T/F)和预测置信度(通常是模型的输出)。TensorBoard UI 将允许您交互式地选择阈值。
- 参数
tag (str) – 数据标识符
labels (torch.Tensor, numpy.ndarray 或 字符串/blob名称) – 真实数据。每个元素的二进制标签。
预测值 (torch.Tensor, numpy.ndarray, 或 字符串/blob 名称) – 元素被分类为真的概率。值应在 [0, 1] 范围内。
global_step (int) – 要记录的全局步长值
阈值数量 (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(layout)[source]¶
通过收集“标量”中的图表标签来创建特殊图表。
注意:此函数每个 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]¶
将网格或 3D 点云添加到 TensorBoard 中。
可视化基于 Three.js,因此允许用户与渲染的物体进行交互。除了顶点、面等基本定义之外,用户还可以进一步提供相机参数、光照条件等。有关高级使用,请查看 https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene。
- 参数
tag (str) – 数据标识符
顶点 (torch.Tensor) – 顶点的 3D 坐标列表。
颜色 (torch.Tensor) – 每个顶点的颜色
面 (torch.Tensor) – 每个三角形中顶点的索引。(可选)
config_dict – 包含 ThreeJS 类名和配置的字典。
global_step (int) – 要记录的全局步长值
walltime (float) – 可选地覆盖默认的 walltime (time.time()),使用事件的纪元后秒数
- 形状
顶点: . (批次、顶点数量、通道)
颜色: . 值应在 [0, 255](类型为 uint8)或 [0, 1](类型为 float)范围内。
面: . 值应在 [0, 顶点数量](类型为 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)[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})
预期结果