doc22_093.md 25.3 KB
Newer Older
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
1 2
# torch.utils.tensorboard

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
3
> 原文:[`pytorch.org/docs/stable/tensorboard.html`](https://pytorch.org/docs/stable/tensorboard.html)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
4

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
5
在继续之前,可以在[`www.tensorflow.org/tensorboard/`](https://www.tensorflow.org/tensorboard/)找到有关 TensorBoard 的更多详细信息
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
6

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
7
安装了 TensorBoard 后,这些实用程序可以让您将 PyTorch 模型和指标记录到目录中,以便在 TensorBoard UI 中进行可视化。标量、图像、直方图、图形和嵌入可视化都支持 PyTorch 模型和张量,以及 Caffe2 网络和 blob。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
8

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
9
SummaryWriter 类是您记录数据以供 TensorBoard 消费和可视化的主要入口。例如:
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

```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() 
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
34
然后可以使用 TensorBoard 进行可视化,应该可以通过以下方式进行安装和运行:
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
35 36 37 38 39 40

```py
pip install tensorboard
tensorboard --logdir=runs 
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
41
可以为一个实验记录大量信息。为了避免使 UI 混乱并获得更好的结果聚类,我们可以通过层次命名来对图进行分组。例如,“Loss/train”和“Loss/test”将被分组在一起,而“Accuracy/train”和“Accuracy/test”将在 TensorBoard 界面中分别分组。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

```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) 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
58
![_images/hier_tags.png](img/hier_tags.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
59 60

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
61
class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
62 63
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
64
直接将条目写入 log_dir 中的事件文件,以供 TensorBoard 消费。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
65

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
66
SummaryWriter 类提供了一个高级 API,用于在给定目录中创建事件文件并向其中添加摘要和事件。该类异步更新文件内容。这允许训练程序从训练循环中直接调用方法将数据添加到文件中,而不会减慢训练速度。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
67 68

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
69
__init__(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
70 71
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
72
创建一个 SummaryWriter,将事件和摘要写入事件文件。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
73 74 75

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
76
+   **log_dir**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 保存目录位置。默认为 runs/**CURRENT_DATETIME_HOSTNAME**,每次运行后都会更改。使用分层文件夹结构可以轻松比较不同运行之间的差异。例如,对于每个新实验,传入‘runs/exp1’,‘runs/exp2’等,以便进行比较。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
77

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
78
+   **comment**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 附加到默认`log_dir`的注释 log_dir 后缀。如果分配了`log_dir`,则此参数无效。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
79

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
80
+   **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`
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
81

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
82
+   **max_queue**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 在一个‘add’调用强制刷新到磁盘之前,待处理事件和摘要队列的大小。默认为十个项目。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
83

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
84
+   **flush_secs**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 多久刷新一次待处理事件和摘要到磁盘。默认为每两分钟一次。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
85

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
86
+   **filename_suffix**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 添加到 log_dir 目录中所有事件文件的后缀。有关文件名构造的更多详细信息,请参阅 tensorboard.summary.writer.event_file_writer.EventFileWriter。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

示例:

```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
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
107
add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
108 109 110 111 112 113
```

将标量数据添加到摘要。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
114
+   **标签**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
115

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
116
+   **scalar_value**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)") *或* *string/blobname*) - 要保存的值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
117

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
118
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
119

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
120
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选,用秒数替换默认的 walltime(time.time())事件后的纪元
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
121

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
122
+   **new_style***布尔值*)- 是否使用新样式(张量字段)或旧样式(simple_value 字段)。新样式可能导致更快的数据加载。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136

示例:

```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() 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
137
![_images/add_scalar.png](img/add_scalar.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
138 139

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
140
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
141 142 143 144 145 146
```

将许多标量数据添加到摘要中。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
147
+   **main_tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 标签的父名称
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
148

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
149
+   **tag_scalar_dict**[*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)"))- 存储标签和相应值的键值对
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
150

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
151
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
152

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
153
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171

示例:

```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. 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
172
![_images/add_scalars.png](img/add_scalars.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
173 174

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
175
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
176 177 178 179 180 181
```

将直方图添加到摘要中。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
182
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
183

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
184
+   **values***torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*)- 构建直方图的值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
185

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
186
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
187

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
188
+   **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)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
189

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
190
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

示例:

```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() 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
206
![_images/add_histogram.png](img/add_histogram.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
207 208

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
209
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
210 211 212 213 214 215 216 217
```

将图像数据添加到摘要中。

请注意,这需要`pillow`包。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
218
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
219

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
220
+   **img_tensor***torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*)- 图像数据
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
221

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
222
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)"))- 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
223

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
224
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)"))- 可选,覆盖默认的事件时刻(time.time())从纪元后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
225

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
226
+   **dataformats**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 图像数据格式规范,形式为 CHW、HWC、HW、WH 等
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
227 228 229

形状:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
230
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`
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

示例:

```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() 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
255
![_images/add_image.png](img/add_image.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
256 257

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
258
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
259 260 261 262 263 264 265 266
```

将批量图像数据添加到摘要中。

请注意,这需要`pillow`包。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
267
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
268

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
269
+   **img_tensor** (*torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*, 或* *string/blobname*) – 图像数据
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
270

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
271
+   **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
272

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
273
+   **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
274

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
275
+   **dataformats** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 图像数据格式规范,如 NCHW、NHWC、CHW、HWC、HW、WH 等。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
276 277 278

形状:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
279
img_tensor: 默认为$(N, 3, H, W)$(N,3,H,W)。如果指定了`dataformats`,将接受其他形状。例如 NCHW 或 NHWC。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298

示例:

```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() 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
299
![_images/add_images.png](img/add_images.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
300 301

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
302
add_figure(tag, figure, global_step=None, close=True, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
303 304
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
305
将 matplotlib 图形渲染为图像并将其添加到摘要中。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
306 307 308 309 310

请注意,这需要`matplotlib`包。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
311
+   **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
312

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
313
+   **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**]**]*) – 图形或图形列表
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
314

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
315
+   **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 中)")*]*) – 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
316

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
317
+   **close** ([*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) – 标志,自动关闭图形
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
318

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
319
+   **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())秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
320 321

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
322
add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
323 324 325 326 327 328 329 330
```

向摘要中添加视频数据。

请注意,这需要`moviepy`包。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
331
+   **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
332

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
333
+   **vid_tensor** (*torch.Tensor*) – 视频数据
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
334

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
335
+   **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
336

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
337
+   **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 中)")) – 每秒帧数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
338

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
339
+   **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
340 341 342

形状:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
343
vid_tensor: $(N, T, C, H, W)$(N,T,C,H,W)。值应在[0, 255]之间,对于 uint8 类型为[0, 255],对于 float 类型为[0, 1]。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
344 345

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
346
add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
347 348 349 350 351 352
```

向摘要中添加音频数据。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
353
+   **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
354

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
355
+   **snd_tensor** (*torch.Tensor*) – 声音数据
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
356

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
357
+   **global_step** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
358

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
359
+   **sample_rate** ([*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) – Hz 中的采样率
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
360

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
361
+   **walltime** ([*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) – 可选,覆盖默认的事件发生时的墙上时间(time.time())秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
362 363 364 365 366 367

形状:

snd_tensor: $(1, L)$(1,L)。值应在[-1, 1]之间。

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
368
add_text(tag, text_string, global_step=None, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
369 370 371 372 373 374
```

向摘要中添加文本数据。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
375
+   **tag** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
376

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
377
+   **text_string**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 要保存的字符串
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
378

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
379
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
380

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
381
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认的 walltime(time.time())事件纪元后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
382 383 384 385 386 387 388 389 390

示例:

```py
writer.add_text('lstm', 'This is an lstm', 0)
writer.add_text('rnn', 'This is an rnn', 10) 
```

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
391
add_graph(model, input_to_model=None, verbose=False, use_strict_trace=True)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
392 393 394 395 396 397
```

将图形数据添加到摘要。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
398
+   **model***torch.nn.Module*) - 要绘制的模型。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
399

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
400
+   **input_to_model***torch.Tensor* *或* [*list*](https://docs.python.org/3/library/stdtypes.html#list "(在 Python v3.12 中)") *of* *torch.Tensor*) - 要馈送的变量或变量元组。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
401

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
402
+   **verbose**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) - 是否在控制台中打印图形结构。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
403

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
404
+   **use_strict_trace**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)")) - 是否将关键字参数 strict 传递给 torch.jit.trace。当您希望跟踪器记录您的可变容器类型(列表、字典)时,请传递 False
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
405 406

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
407
add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
408 409 410 411 412 413
```

将嵌入式投影仪数据添加到摘要。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
414
+   **mat***torch.Tensor* *或* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")) - 每行是数据点特征向量的矩阵
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
415

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
416
+   **metadata**[*list*](https://docs.python.org/3/library/stdtypes.html#list "(在 Python v3.12 中)")) - 一个标签列表,每个元素将被转换为字符串
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
417

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
418
+   **label_img***torch.Tensor*) - 图像对应于每个数据点
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
419

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
420
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
421

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
422
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 嵌入的名称
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
423 424 425

形状:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
426
mat:$(N, D)$(N,D),其中 N 是数据的数量,D 是特征维度
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452

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
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
453
add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
454 455 456 457
```

添加精度召回曲线。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
458
绘制精度-召回曲线可以让您了解模型在不同阈值设置下的性能。使用此函数,您为每个目标提供地面真实标签(T/F)和预测置信度(通常是您模型的输出)。TensorBoard UI 将允许您交互式选择阈值。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
459 460 461

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
462
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
463

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
464
+   **labels***torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*) - 地面真实数据。每个元素的二进制标签。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
465

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
466
+   **predictions***torch.Tensor**,* [*numpy.ndarray*](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray "(在 NumPy v1.26 中)")*,或* *string/blobname*) - 元素被分类为真的概率。值应在[0, 1]之间
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
467

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
468
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
469

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
470
+   **num_thresholds**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 用于绘制曲线的阈值数量。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
471

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
472
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认的 walltime(time.time())事件纪元后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485 486

示例:

```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
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
487
add_custom_scalars(layout)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
488 489 490 491
```

通过在“标量”中收集图表标签创建特殊图表。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
492
注意:此函数每个 SummaryWriter()对象只能调用一次。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
493

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
494
因为它只提供元数据给 tensorboard,所以该函数可以在训练循环之前或之后调用。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
495 496 497

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
498
**layout**[*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - {categoryName: *charts*},其中*charts*也是一个字典{chartName: *ListOfProperties*}。*ListOfProperties*中的第一个元素是图表的类型(**Multiline****Margin**之一),第二个元素应该是一个包含您在 add_scalar 函数中使用的标签的列表,这些标签将被收集到新的图表中。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
499 500 501 502 503 504 505 506 507 508 509 510

示例:

```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
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
511
add_mesh(tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
512 513
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
514
将网格或 3D 点云添加到 TensorBoard。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
515

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
516
可视化基于 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)以获取高级用法。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
517 518 519

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
520
+   **tag**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 数据标识符
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
521

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
522
+   **vertices***torch.Tensor*) - 顶点的 3D 坐标列表。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
523

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
524
+   **colors***torch.Tensor*) - 每个顶点的颜色
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
525

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
526
+   **faces***torch.Tensor*) - 每个三角形内顶点的索引。 (可选)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
527

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
528
+   **config_dict** - 包含 ThreeJS 类名称和配置的字典。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
529

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
530
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
531

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
532
+   **walltime**[*float*](https://docs.python.org/3/library/functions.html#float "(在 Python v3.12 中)")) - 可选覆盖默认 walltime(time.time())事件后的秒数
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
533 534 535 536 537

形状:

顶点:$(B, N, 3)$(B,N,3)。 (批次,顶点数量,通道)

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
538
颜色:$(B, N, 3)$(B,N,3)。值应该在[0, 255]之间,对于 uint8 类型或[0, 1]之间,对于 float 类型。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
539

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
540
面:$(B, N, 3)$(B,N,3)。值应该在[0, 顶点数量]之间,对于 uint8 类型。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571

示例:

```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
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
572
add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None, global_step=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
573 574
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
575
添加一组要在 TensorBoard 中进行比较的超参数。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
576 577 578

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
579
+   **hparam_dict**[*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - 字典中的每个键值对是超参数的名称及其对应的值。值的类型可以是 bool、string、float、int 或 None 中的一个。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
580

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
581
+   **metric_dict**[*dict*](https://docs.python.org/3/library/stdtypes.html#dict "(在 Python v3.12 中)")) - 字典中的每个键值对是指标的名称及其对应的值。请注意,此处使用的键应在 tensorboard 记录中是唯一的。否则,您通过`add_scalar`添加的值将显示在 hparam 插件中。在大多数情况下,这是不希望的。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
582 583 584

+   **hparam_domain_discrete** - (Optional[Dict[str, List[Any]])包含超参数名称及其所有离散值的字典

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
585
+   **run_name**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) - 运行的名称,将包含在 logdir 的一部分中。如果未指定,将使用当前时间戳。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
586

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
587
+   **global_step**[*int*](https://docs.python.org/3/library/functions.html#int "(在 Python v3.12 中)")) - 要记录的全局步骤值
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
588 589 590 591 592 593 594 595 596 597 598 599 600

示例:

```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}) 
```

预期结果:

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
601
![_images/add_hparam.png](img/add_hparam.png)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
602 603

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
604
flush()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
605 606 607 608 609 610 611
```

将事件文件刷新到磁盘。

调用此方法以确保所有待处理事件都已写入磁盘。

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
612
close()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
613
```