torch.utils.tensorboard¶
在深入探討之前,可以在 https://tensorflow.dev.org.tw/tensorboard/ 找到更多關於 TensorBoard 的詳細資訊
一旦您安裝了 TensorBoard,這些實用程式可讓您將 PyTorch 模型和指標記錄到目錄中,以便在 TensorBoard UI 中進行視覺化。 純量、圖像、直方圖、圖形和嵌入視覺化都支援 PyTorch 模型和 Tensor,以及 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][source]¶
將條目直接寫入 log_dir 中的事件檔案,以供 TensorBoard 使用。
SummaryWriter 類別提供高階 API,以便在給定的目錄中建立事件檔案,並將摘要和事件新增至其中。此類別會非同步更新檔案內容。這允許訓練程式呼叫方法,直接從訓練迴圈將資料新增至檔案,而不會減慢訓練速度。
- __init__(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')[source][source]¶
建立一個 SummaryWriter,它會將事件和摘要寫出到事件檔案。
- 參數
log_dir (str) – 儲存目錄位置。預設值為 runs/CURRENT_DATETIME_HOSTNAME,每次執行後都會變更。使用階層式資料夾結構可以輕鬆比較各次執行。例如,為每個新實驗傳入 'runs/exp1'、'runs/exp2' 等,以便跨實驗進行比較。
comment (str) – 附加到預設
log_dir
的註解 log_dir 後綴。如果已指定log_dir
,則此引數無效。purge_step (int) – 當記錄在步驟 當機,並在步驟 重新啟動時,global_step 大於或等於 的任何事件都將被清除,並從 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][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)[原始碼][原始碼]¶
將多個純量資料加入摘要。
- 參數
範例
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)[原始碼][原始碼]¶
將直方圖加入摘要。
- 參數
tag (str) – 資料識別碼
values (torch.Tensor, numpy.ndarray, 或 string/blobname) – 用於建立直方圖的值
global_step (int) – 要記錄的全域步驟值
bins (str) – 選項之一 {‘tensorflow’,’auto’, ‘fd’, …}。這決定了 bins 的建立方式。你可以在以下連結中找到其他選項: https://scipy-docs.dev.org.tw/doc/numpy/reference/generated/numpy.histogram.html
walltime (float) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
範例
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
套件。- 參數
tag (str) – 資料識別碼
img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 圖片資料
global_step (int) – 要記錄的全域步驟值
walltime (float) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
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][source]¶
將批次圖片資料加入摘要。
請注意,這需要
pillow
套件。- 參數
tag (str) – 資料識別碼
img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 圖片資料
global_step (int) – 要記錄的全域步驟值
walltime (float) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
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][source]¶
將 matplotlib 圖形渲染成圖片並將其加入摘要。
請注意,這需要
matplotlib
套件。
- add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[source][source]¶
將影片資料加入摘要。
請注意,這需要
moviepy
套件。- 參數
- 形狀
vid_tensor: 。對於 uint8 類型,值應位於 [0, 255] 範圍內;對於 float 類型,值應位於 [0, 1] 範圍內。
- add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)[source][source]¶
將音訊資料加入摘要。
- 參數
tag (str) – 資料識別碼
snd_tensor (torch.Tensor) – 音訊資料
global_step (int) – 要記錄的全域步驟值
sample_rate (int) – 採樣率(以赫茲為單位)
walltime (float) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
- 形狀
snd_tensor: 。值應介於 [-1, 1] 之間。
- add_text(tag, text_string, global_step=None, walltime=None)[原始碼][原始碼]¶
新增文字資料到 summary。
- 參數
範例
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)[原始碼][原始碼]¶
新增圖形資料到 summary。
- 參數
model (torch.nn.Module) – 要繪製的模型。
input_to_model (torch.Tensor 或 list 的 torch.Tensor) – 要餵入的變數或變數元組。
verbose (bool) – 是否要在主控台中印出圖形結構。
use_strict_trace (bool) – 是否要將關鍵字引數 strict 傳遞給 torch.jit.trace。當您希望追蹤器記錄您的可變容器類型(list、dict)時,傳遞 False
- add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)[原始碼][原始碼]¶
新增 embedding projector 資料到 summary。
- 參數
mat (torch.Tensor 或 numpy.ndarray) – 一個矩陣,其中每一列是資料點的特徵向量
metadata (list) – 標籤列表,每個元素將被轉換為字串
label_img (torch.Tensor) – 對應於每個資料點的圖像
global_step (int) – 要記錄的全域步驟值
tag (str) – embedding 的名稱
metadata_header (list) – 多欄 metadata 的標頭列表。 如果給定,則每個 metadata 必須是一個列表,其值對應於標頭。
- 形狀
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)
注意
如果類別(即非數字)metadata 要用於 embedding projector 中的著色,則不能有超過 50 個唯一值。
- add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)[source][source]¶
加入精確率-召回率曲線。
繪製精確率-召回率曲線讓您了解您的模型在不同閾值設定下的效能。使用此函數,您可以為每個目標提供真實標籤 (T/F) 和預測置信度(通常是模型的輸出)。 TensorBoard UI 將讓您以互動方式選擇閾值。
- 參數
tag (str) – 資料識別碼
labels (torch.Tensor, numpy.ndarray, or string/blobname) – 真實數據。每個元素的二元標籤。
predictions (torch.Tensor, numpy.ndarray, or string/blobname) – 元素被分類為真的機率。數值應在 [0, 1] 之間。
global_step (int) – 要記錄的全域步驟值
num_thresholds (int) – 用於繪製曲線的閾值數量。
walltime (float) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
範例
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][source]¶
通過在 'scalars' 中收集圖表標籤來建立特殊圖表。
注意:每個 SummaryWriter() 物件只能呼叫此函數一次。
由於它只提供 metadata 給 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][source]¶
將網格或 3D 點雲加入 TensorBoard。
該可視化基於 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) – 可選的覆寫預設 walltime(time.time())事件的 epoch 之後的秒數
- 形狀
vertices: . (批次大小, 頂點數量, 通道數)
colors: . 對於 uint8 類型,值應位於 [0, 255] 範圍內;對於 float 類型,值應位於 [0, 1] 範圍內。
faces: . 對於 uint8 類型,值應位於 [0, 頂點數量] 範圍內。
範例
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][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})
預期結果