# torch.utils.tensorboard > 原文:[`pytorch.org/docs/stable/tensorboard.html`](https://pytorch.org/docs/stable/tensorboard.html) 在继续之前,可以在[`www.tensorflow.org/tensorboard/`](https://www.tensorflow.org/tensorboard/)找到有关 TensorBoard 的更多详细信息 安装了 TensorBoard 后,这些实用程序可以让您将 PyTorch 模型和指标记录到目录中,以便在 TensorBoard UI 中进行可视化。标量、图像、直方图、图形和嵌入可视化都支持 PyTorch 模型和张量,以及 Caffe2 网络和 blob。 SummaryWriter 类是您记录数据以供 TensorBoard 消费和可视化的主要入口。例如: ```py 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 进行可视化,应该可以通过以下方式进行安装和运行: ```py pip install tensorboard tensorboard --logdir=runs ``` 可以为一个实验记录大量信息。为了避免使 UI 混乱并获得更好的结果聚类,我们可以通过层次命名来对图进行分组。例如,“Loss/train”和“Loss/test”将被分组在一起,而“Accuracy/train”和“Accuracy/test”将在 TensorBoard 界面中分别分组。 ```py 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](img/hier_tags.png) ```py 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,用于在给定目录中创建事件文件并向其中添加摘要和事件。该类异步更新文件内容。这允许训练程序从训练循环中直接调用方法将数据添加到文件中,而不会减慢训练速度。 ```py __init__(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='') ``` 创建一个 SummaryWriter,将事件和摘要写入事件文件。 参数 + **log_dir**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 保存目录位置。默认为 runs/**CURRENT_DATETIME_HOSTNAME**,每次运行后都会更改。使用分层文件夹结构可以轻松比较不同运行之间的差异。例如,对于每个新实验,传入‘runs/exp1’,‘runs/exp2’等,以便进行比较。 + **comment**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 附加到默认`log_dir`的注释 log_dir 后缀。如果分配了`log_dir`,则此参数无效。 + **purge_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 当日志在步骤$T+X$T+X 处崩溃并在步骤$T$T 处重新启动时,任何全局步骤大于或等于$T$T 的事件将被清除并从 TensorBoard 中隐藏。请注意,崩溃和恢复的实验应该具有相同的`log_dir`。 + **max_queue**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 在一个‘add’调用强制刷新到磁盘之前,待处理事件和摘要队列的大小。默认为十个项目。 + **flush_secs**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 多久刷新一次待处理事件和摘要到磁盘。默认为每两分钟一次。 + **filename_suffix**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 添加到 log_dir 目录中所有事件文件的后缀。有关文件名构造的更多详细信息,请参阅 tensorboard.summary.writer.event_file_writer.EventFileWriter。 示例: ```py 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/ ``` ```py add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False) ``` 将标量数据添加到摘要。 参数 + **标签**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符 + **scalar_value**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)") *或* *string/blobname*) - 要保存的值 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选,用秒数替换默认的 walltime(time.time())事件后的纪元 + **new_style**(*布尔值*)- 是否使用新样式(张量字段)或旧样式(simple_value 字段)。新样式可能导致更快的数据加载。 示例: ```py 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](img/add_scalar.png) ```py add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None) ``` 将许多标量数据添加到摘要中。 参数 + **main_tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 标签的父名称 + **tag_scalar_dict**([*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)"))- 存储标签和相应值的键值对 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数 示例: ```py 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](img/add_scalars.png) ```py add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None) ``` 将直方图添加到摘要中。 参数 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符 + **values**(*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*)- 构建直方图的值 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值 + **bins**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 其中之一{‘tensorflow’,’auto’,‘fd’,…}。这决定了如何制作箱子。您可以在此处找到其他选项:[`docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html) + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数 示例: ```py 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](img/add_histogram.png) ```py add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW') ``` 将图像数据添加到摘要中。 请注意,这需要`pillow`包。 参数 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符 + **img_tensor**(*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*)- 图像数据 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数 + **dataformats**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 图像数据格式规范,形式为 CHW、HWC、HW、WH 等 形状: img_tensor:默认为$(3, H, W)$(3,H,W)。您可以使用`torchvision.utils.make_grid()`将一批张量转换为 3xHxW 格式,或调用`add_images`并让我们来做这项工作。张量$(1, H, W)$(1,H,W)、$(H, W)$(H,W)、$(H, W, 3)$(H,W,3)也适合,只要传递相应的`dataformats`参数,例如`CHW`、`HWC`、`HW`。 示例: ```py 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](img/add_image.png) ```py add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW') ``` 将批量图像数据添加到摘要中。 请注意,这需要`pillow`包。 参数 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符 + **img_tensor** (*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*, 或* *string/blobname*) – 图像数据 + **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值 + **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数 + **dataformats** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 图像数据格式规范,如 NCHW、NHWC、CHW、HWC、HW、WH 等。 形状: img_tensor: 默认为$(N, 3, H, W)$(N,3,H,W)。如果指定了`dataformats`,将接受其他形状。例如 NCHW 或 NHWC。 示例: ```py 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](img/add_images.png) ```py add_figure(tag, figure, global_step=None, close=True, walltime=None) ``` 将 matplotlib 图形渲染为图像并将其添加到摘要中。 请注意,这需要`matplotlib`包。 参数 + **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符 + **figure** ([*Union*](https://docs.python.org/3/library/typing.html#typing.Union "(在 Python v3.12 中)")*[**Figure**,* [*List*](https://docs.python.org/3/library/typing.html#typing.List "(在 Python v3.12 中)")*[**Figure**]**]*) – 图形或图形列表 + **global_step** ([*可选*](https://docs.python.org/3/library/typing.html#typing.Optional "(在 Python v3.12 中)")*[*[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")*]*) – 要记录的全局步骤值 + **close** ([*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) – 标志,自动关闭图形 + **walltime** ([*可选*](https://docs.python.org/3/library/typing.html#typing.Optional "(在 Python v3.12 中)")*[*[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")*]*) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数 ```py add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None) ``` 向摘要中添加视频数据。 请注意,这需要`moviepy`包。 参数 + **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符 + **vid_tensor** (*torch.Tensor*) – 视频数据 + **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值 + **fps** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)") *或* [*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 每秒帧数 + **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数 形状: vid_tensor: $(N, T, C, H, W)$(N,T,C,H,W)。值应在[0, 255]之间,对于 uint8 类型为[0, 255],对于 float 类型为[0, 1]。 ```py add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None) ``` 向摘要中添加音频数据。 参数 + **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符 + **snd_tensor** (*torch.Tensor*) – 声音数据 + **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值 + **sample_rate** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – Hz 中的采样率 + **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数 形状: snd_tensor: $(1, L)$(1,L)。值应在[-1, 1]之间。 ```py add_text(tag, text_string, global_step=None, walltime=None) ``` 向摘要中添加文本数据。 参数 + **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符 + **text_string**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 要保存的字符串 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认的 walltime(time.time())事件纪元后的秒数 示例: ```py writer.add_text('lstm', 'This is an lstm', 0) writer.add_text('rnn', 'This is an rnn', 10) ``` ```py add_graph(model, input_to_model=None, verbose=False, use_strict_trace=True) ``` 将图形数据添加到摘要。 参数 + **model**(*torch.nn.Module*) - 要绘制的模型。 + **input_to_model**(*torch.Tensor* *或* [*list*](https://docs.python.org/3/library/stdtypes.html#list "(在 Python v3.12 中)") *of* *torch.Tensor*) - 要馈送的变量或变量元组。 + **verbose**([*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) - 是否在控制台中打印图形结构。 + **use_strict_trace**([*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) - 是否将关键字参数 strict 传递给 torch.jit.trace。当您希望跟踪器记录您的可变容器类型(列表、字典)时,请传递 False ```py add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None) ``` 将嵌入式投影仪数据添加到摘要。 参数 + **mat**(*torch.Tensor* *或* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")) - 每行是数据点特征向量的矩阵 + **metadata**([*list*](https://docs.python.org/3/library/stdtypes.html#list "(在 Python v3.12 中)")) - 一个标签列表,每个元素将被转换为字符串 + **label_img**(*torch.Tensor*) - 图像对应于每个数据点 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 嵌入的名称 形状: mat:$(N, D)$(N,D),其中 N 是数据的数量,D 是特征维度 label_img:$(N, C, H, W)$(N,C,H,W) 示例: ```py 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) ``` ```py add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None) ``` 添加精度召回曲线。 绘制精度-召回曲线可以让您了解模型在不同阈值设置下的性能。使用此函数,您为每个目标提供地面真实标签(T/F)和预测置信度(通常是您模型的输出)。TensorBoard UI 将允许您交互式选择阈值。 参数 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符 + **labels**(*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*) - 地面真实数据。每个元素的二进制标签。 + **predictions**(*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*) - 元素被分类为真的概率。值应在[0, 1]之间 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 + **num_thresholds**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 用于绘制曲线的阈值数量。 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认的 walltime(time.time())事件纪元后的秒数 示例: ```py 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() ``` ```py add_custom_scalars(layout) ``` 通过在“标量”中收集图表标签创建特殊图表。 注意:此函数每个 SummaryWriter()对象只能调用一次。 因为它只提供元数据给 tensorboard,所以该函数可以在训练循环之前或之后调用。 参数 **layout**([*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - {categoryName: *charts*},其中*charts*也是一个字典{chartName: *ListOfProperties*}。*ListOfProperties*中的第一个元素是图表的类型(**Multiline**或**Margin**之一),第二个元素应该是一个包含您在 add_scalar 函数中使用的标签的列表,这些标签将被收集到新的图表中。 示例: ```py 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) ``` ```py add_mesh(tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None) ``` 将网格或 3D 点云添加到 TensorBoard。 可视化基于 Three.js,因此允许用户与渲染的对象进行交互。除了基本定义如顶点、面外,用户还可以进一步提供相机参数、光照条件等。请查看[`threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene`](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene)以获取高级用法。 参数 + **tag**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符 + **vertices**(*torch.Tensor*) - 顶点的 3D 坐标列表。 + **colors**(*torch.Tensor*) - 每个顶点的颜色 + **faces**(*torch.Tensor*) - 每个三角形内顶点的索引。 (可选) + **config_dict** - 包含 ThreeJS 类名称和配置的字典。 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 + **walltime**([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认 walltime(time.time())事件后的秒数 形状: 顶点:$(B, N, 3)$(B,N,3)。 (批次,顶点数量,通道) 颜色:$(B, N, 3)$(B,N,3)。值应该在[0, 255]之间,对于 uint8 类型或[0, 1]之间,对于 float 类型。 面:$(B, N, 3)$(B,N,3)。值应该在[0, 顶点数量]之间,对于 uint8 类型。 示例: ```py 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() ``` ```py add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None, global_step=None) ``` 添加一组要在 TensorBoard 中进行比较的超参数。 参数 + **hparam_dict**([*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - 字典中的每个键值对是超参数的名称及其对应的值。值的类型可以是 bool、string、float、int 或 None 中的一个。 + **metric_dict**([*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - 字典中的每个键值对是指标的名称及其对应的值。请注意,此处使用的键应在 tensorboard 记录中是唯一的。否则,您通过`add_scalar`添加的值将显示在 hparam 插件中。在大多数情况下,这是不希望的。 + **hparam_domain_discrete** - (Optional[Dict[str, List[Any]])包含超参数名称及其所有离散值的字典 + **run_name**([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 运行的名称,将包含在 logdir 的一部分中。如果未指定,将使用当前时间戳。 + **global_step**([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值 示例: ```py 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](img/add_hparam.png) ```py flush() ``` 将事件文件刷新到磁盘。 调用此方法以确保所有待处理事件都已写入磁盘。 ```py close() ```