在进一步讨论之前,可以在 https://www.tensorflow.org/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 将其可视化,它应该可以通过以下方式安装和运行:
pip install tensorboard
tensorboard --logdir=runs
一项实验可以记录大量信息。 为了避免 UI 混乱并获得更好的结果聚类,我们可以通过分层命名来对图进行分组。 例如,在 TensorBoard 界面中,“Loss/train”和“Loss/test”将被分组在一起,而“Accuracy/train”和“Accuracy/test”将被单独分组。
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。
参数:
1、log_dir (string) – 保存目录位置。默认为runs/CURRENT_DATETIME_HOSTNAME,每次运行后都会更改。使用分层文件夹结构轻松比较运行。 例如 为每个新实验传入“runs/exp1”、“runs/exp2”等,以进行比较。
2、comment (string) – 注释 log_dir 后缀附加到默认 log_dir。 如果分配了 log_dir,则此参数无效。
3、purge_step (int) – 当日志记录在步骤 T+X 崩溃并在步骤 T 重新启动时,任何 global_step 大于或等于 T 的事件都将被清除并从 TensorBoard 中隐藏。 请注意,崩溃和恢复的实验应该具有相同的 log_dir。
4、max_queue (int) – 在“add”调用之一强制刷新到磁盘之前,挂起事件和摘要的队列大小。 默认为十项。
5、flush_secs (int) – 将挂起的事件和摘要刷新到磁盘的频率(以秒为单位)。 默认为每两分钟。
6、filename_suffix (string) – 添加到 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)
将标量数据添加到汇总中。
参数:
1、tag (string) – 数据标识符
2、scalar_value (float or string/blobname) – 要保存的值
3、global_step (int) – 要记录的全局步长值
4、walltime (float) – 可选覆盖默认的 walltime (time.time()) 与事件纪元后的秒数
5、new_style (boolean) – 是使用新样式(张量字段)还是旧样式(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()
预期结果:
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
将许多标量数据添加到摘要中。
参数:
1、main_tag (string) – 标签的父名称
2、tag_scalar_dict (dict) – 存储标签和对应值的键值对
3、global_step (int) – 要记录的全局步长值
4、walltime (float) – 可选覆盖默认 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.
预期结果:
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
将直方图添加到摘要中。
参数:
1、tag (string) – 数据标识符
2、values (torch.Tensor, numpy.array, or string/blobname) – 建立直方图的值
3、global_step (int) – 要记录的全局步长值
4、bins (string) – {'tensorflow','auto', 'fd', ...} 之一。 这决定了垃圾箱的制作方式。 您可以在以下位置找到其他选项:https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
5、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')
将图像数据添加到摘要中。
请注意,这需要pillow包。
参数:
1、tag (string) – 数据标识符
2、img_tensor (torch.Tensor, numpy.array, or string/blobname) – 图像数据
3、global_step (int) – 要记录的全局步长值
4、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
形状:
img_tensor:默认为(3,H,W)。您可以使用 torchvision.utils.make_grid() 将一批张量转换为 3xHxW 格式或调用 add_images 并让我们完成这项工作。 只要传递相应的数据格式参数,带有 (1, H, W), (H,W), (H, W, 3) 的张量也适用,例如 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包。
参数:
1、tag (string) – 数据标识符
2、img_tensor (torch.Tensor, numpy.array, or string/blobname) – 图像数据
3、global_step (int) – 要记录的全局步长值
4、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
5、dataformats (string) – NCHW、NHWC、CHW、HWC、HW、WH 等形式的图像数据格式规范。
形状:
img_tensor:默认为 (N, 3, H, W)。 如果指定了数据格式,将接受其他形状。 例如 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 包。
参数:
1、tag (string) – 数据标识符
2、figure (matplotlib.pyplot.figure) – 图或图列表
3、global_step (int) – 要记录的全局步长值
4、close (bool) – 自动关闭图形的标志
5、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)
将视频数据添加到摘要中。
请注意,这需要 moviepy 包。
参数:
1、tag (string) – 数据标识符
2、vid_tensor (torch.Tensor) – 视频数据
3、global_step (int) – 要记录的全局步长值
4、fps (float or int) – 每秒帧数
5、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
形状:
vid_tensor:(N,T,C,H,W)。 对于 uint8 类型,这些值应该在 [0, 255] 或对于 float 类型的 [0, 1] 中。
add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)
将音频数据添加到摘要中。
参数:
1、tag (string) – 数据标识符
2、snd_tensor (torch.Tensor) – 声音数据
3、global_step (int) – 要记录的全局步长值
4、sample_rate (int) – 以赫兹为单位的采样率
5、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
形状:
snd_tensor: (1, L)。 值应介于 [-1, 1] 之间。
add_text(tag, text_string, global_step=None, walltime=None)
将文本数据添加到摘要中。
参数:
1、tag (string) – 数据标识符
2、text_string (string) – 要保存的字符串
3、global_step (int) – 要记录的全局步长值
4、walltime (float) – 可选覆盖默认 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)
将图形数据添加到摘要中。
参数:
1、模型 (torch.nn.Module) – 要绘制的模型。
2、input_to_model (torch.Tensor or list of torch.Tensor) – 要输入的变量或变量元组。
3、verbose (bool) – 是否在控制台中打印图形结构。
add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)
将嵌入的投影仪数据添加到摘要中。
参数:
1、mat (torch.Tensor or numpy.array) – 一个矩阵,每一行都是数据点的特征向量
2、metadata (list) – 标签列表,每个元素将被转换为字符串
3、label_img (torch.Tensor) – 图像对应每个数据点
4、global_step (int) – 要记录的全局步长值
5、tag (string) – 嵌入的名称
形状:
mat: (N, D),其中 N 是数据数量,D 是特征维度
label_img: (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)
添加精确召回曲线。 绘制精确召回曲线可让您了解模型在不同阈值设置下的性能。 使用此功能,您可以为每个目标提供真实数据标签 (T/F) 和预测置信度(通常是模型的输出)。 TensorBoard UI 将让您以交互方式选择阈值。
参数:
1、tag (string) – 数据标识符
2、labels(torch.Tensor、numpy.array 或 string/blobname)——真实数据。 每个元素的二进制标签。
3、predictions(torch.Tensor、numpy.array 或 string/blobname)– 元素被归类为真的概率。 值应该在 [0, 1]
4、global_step (int) – 要记录的全局步长值
5、num_thresholds (int) – 用于绘制曲线的阈值数。
6、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)
通过在“标量”中收集图表标签来创建特殊图表。 请注意,此函数只能为每个 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)
向 TensorBoard 添加网格或 3D 点云。 可视化基于 Three.js,因此它允许用户与渲染对象进行交互。 除了顶点、面等基本定义外,用户还可以提供相机参数、光照条件等。请查看https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene 高级用法。
参数:
1、tag (string) – 数据标识符
2、vertices (torch.Tensor) – 顶点的 3D 坐标列表。
3、colors (torch.Tensor) – 每个顶点的颜色
4、faces (torch.Tensor) – 每个三角形内顶点的索引。 (可选的)
5、config_dict – 包含 ThreeJS 类名称和配置的字典。
6、global_step (int) – 要记录的全局步长值
7、walltime (float) – 可选覆盖默认 walltime (time.time()) 事件纪元后的秒数
形状:
顶点:(B,N,3)。 (batch,number_of_vertices,channels)
颜色:(B,N,3)。 对于 uint8 类型,这些值应该在 [0, 255] 或对于 float 类型的 [0, 1] 中。
面孔:(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)
添加一组要在 TensorBoard 中进行比较的超参数。
参数:
1、hparam_dict (dict) - 字典中的每个键值对都是超参数的名称及其对应的值。 值的类型可以是 bool、string、float、int 或 None 之一。
2、metric_dict (dict) – 字典中的每个键值对都是度量的名称及其对应的值。 请注意,此处使用的密钥在 tensorboard 记录中应该是唯一的。 否则,您通过 add_scalar 添加的值将显示在 hparam 插件中。 在大多数情况下,这是不需要的。
3、hparam_domain_discrete – (Optional[Dict[str, List[Any]]]) 包含超参数名称和它们可以保存的所有离散值的字典
4、run_name (str) – 运行的名称,作为 logdir 的一部分包含在内。 如果未指定,将使用当前时间戳。
例子:
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})
预期结果:
flush()
将事件文件刷新到磁盘。 调用此方法以确保所有挂起的事件都已写入磁盘。