評價此頁

torch.utils.tensorboard#

創建於:2019年4月25日 | 最後更新於:2022年3月10日

在深入之前,更多關於 TensorBoard 的詳情請參見 https://www.tensorflow.org/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)

預期結果

_images/hier_tags.png


class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[source]#

直接將條目寫入事件檔案,供 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) – 當日志在步驟 T+XT+X 處崩潰並從步驟 TT 重新開始時,所有全域性步長大於或等於 TT 的事件將被清除並隱藏在 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]#

向摘要新增標量資料。

引數
  • tag (str) – 資料識別符號

  • scalar_value (floatstring/blobname) – 要儲存的值

  • global_step (int) – 要記錄的全域性步長值

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

  • new_style (boolean) – 是否使用新樣式(tensor 欄位)或舊樣式(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()

預期結果

_images/add_scalar.png
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)[source]#

向摘要新增多個標量資料。

引數
  • main_tag (str) – 標籤的父名稱

  • tag_scalar_dict (dict) – 鍵值對,儲存標籤和對應的值

  • global_step (int) – 要記錄的全域性步長值

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 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.

預期結果

_images/add_scalars.png
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)[source]#

向摘要新增直方圖。

引數

示例

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
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')[source]#

向摘要新增影像資料。

請注意,這需要 pillow 包。

引數
  • tag (str) – 資料識別符號

  • img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 影像資料

  • global_step (int) – 要記錄的全域性步長值

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

  • dataformats (str) – 影像資料格式規範,形式為 CHW、HWC、HW、WH 等。

形狀

img_tensor:預設為 (3,H,W)(3, H, W)。您可以使用 torchvision.utils.make_grid() 將一批張量轉換為 3xHxW 格式,或呼叫 add_images 並讓我們處理。

示例

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
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')[source]#

向摘要新增批次影像資料。

請注意,這需要 pillow 包。

引數
  • tag (str) – 資料識別符號

  • img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 影像資料

  • global_step (int) – 要記錄的全域性步長值

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

  • dataformats (str) – 影像資料格式規範,形式為 NCHW、NHWC、CHW、HWC、HW、WH 等。

形狀

img_tensor:預設為 (N,3,H,W)(N, 3, H, W)。如果指定了 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()

預期結果

_images/add_images.png
add_figure(tag, figure, global_step=None, close=True, walltime=None)[source]#

將 matplotlib 圖渲染成影像並新增到摘要中。

請注意,這需要 matplotlib 包。

引數
  • tag (str) – 資料識別符號

  • figure (Union[Figure, list of 'Figure']) – 圖形或圖形列表

  • global_step (Optional[int]) – 要記錄的全域性步長值

  • close (bool) – 自動關閉圖形的標誌

  • walltime (Optional[float]) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[source]#

向摘要新增影片資料。

請注意,這需要 moviepy 包。

引數
  • tag (str) – 資料識別符號

  • vid_tensor (torch.Tensor) – 影片資料

  • global_step (int) – 要記錄的全域性步長值

  • fps (floatint) – 每秒幀數

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

形狀

vid_tensor:(N,T,C,H,W)(N, T, C, H, W)。對於 uint8 型別,值應在 [0, 255] 範圍內;對於 float 型別,值應在 [0, 1] 範圍內。

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) – 取樣率(Hz)

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 walltime (time.time())

形狀

snd_tensor:(1,L)(1, L)。值應在 [-1, 1] 之間。

add_text(tag, text_string, global_step=None, walltime=None)[source]#

向摘要新增文字資料。

引數
  • tag (str) – 資料識別符號

  • text_string (str) – 要儲存的字串

  • global_step (int) – 要記錄的全域性步長值

  • walltime (float) – 可選,用事件的 epoch 秒數覆蓋預設 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, use_strict_trace=True)[source]#

向摘要新增圖資料。

引數
  • model (torch.nn.Module) – 要繪製的模型。

  • input_to_model (torch.Tensorlist 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.Tensornumpy.ndarray) – 一個矩陣,每行是資料點的特徵向量

  • metadata (list) – 一個標籤列表,每個元素都將被轉換為字串

  • label_img (torch.Tensor) – 與每個資料點對應的影像

  • global_step (int) – 要記錄的全域性步長值

  • tag (str) – 嵌入的名稱

  • metadata_header (list) – 多列元資料的標題列表。如果提供,每個元資料都必須是一個列表,其中包含與標題對應的值。

形狀

mat:(N,D)(N, D),其中 N 是資料數量,D 是特徵維度

label_img:(N,C,H,W)(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)

注意

分類(即非數值)元資料最多不能有 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, 或 string/blobname) – 真實資料。每個元素的二元標籤。

  • predictions (torch.Tensor, numpy.ndarray, 或 string/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]#

透過在‘scalars’中收集圖表標籤來建立特殊圖表。

注意:此函式只能為每個 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]#

向 TensorBoard 新增網格或 3D 點雲。

該視覺化基於 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:(B,N,3)(B, N, 3)。(批次,頂點數,通道)

colors:(B,N,3)(B, N, 3)。對於 uint8 型別,值應在 [0, 255] 範圍內;對於 float 型別,值應在 [0, 1] 範圍內。

faces:(B,N,3)(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, global_step=None)[source]#

新增一組要在 TensorBoard 中進行比較的超引數。

引數
  • hparam_dict (dict) – 字典中的每個鍵值對是超引數的名稱及其對應的值。值的型別可以是 boolstringfloatintNone 之一。

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

預期結果

_images/add_hparam.png
flush()[source]#

將事件檔案重新整理到磁碟。

呼叫此方法可確保所有待處理事件都已寫入磁碟。

close()[source]#