torch.utils.tensorboard¶
在繼續之前,您可以在 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 進行視覺化,TensorBoard 應該可以使用以下命令安裝和執行
pip install tensorboard
tensorboard --logdir=runs
一個實驗可以記錄很多資訊。為了避免 UI 雜亂無章並獲得更好的結果分群,我們可以透過階層式命名來對圖表進行分組。例如,「損失/訓練」和「損失/測試」將被分組在一起,而「準確度/訓練」和「準確度/測試」將在 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)
預期結果
 
- 類別 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,它會將事件和摘要寫入事件檔案。 - 參數
- 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) – 在其中一個「新增」呼叫強制將資料寫入磁碟之前,待處理事件和摘要的佇列大小。預設值為 10 個項目。 
- 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)[原始碼]¶
- 將純量資料新增至摘要。 - 參數
 - 範例 - 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’, …} 其中之一。這決定了如何製作 bin。您可以在以下網址找到其他選項:https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html 
- 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套件。- 參數
- tag (str) – 資料識別碼 
- img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 影像資料 
- global_step (int) – 要記錄的全局步驟值 
- walltime (float) – 選擇性覆寫預設 walltime (time.time()),以事件時期後的秒數表示 
- 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')[原始碼]¶
- 將批次的影像資料新增至摘要。 - 請注意,這需要 - pillow套件。- 參數
- tag (str) – 資料識別碼 
- img_tensor (torch.Tensor, numpy.ndarray, 或 string/blobname) – 影像資料 
- global_step (int) – 要記錄的全局步驟值 
- walltime (float) – 選擇性覆寫預設 walltime (time.time()),以事件時期後的秒數表示 
- 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)[原始碼]¶
- 將 matplotlib 圖表渲染成影像並將其新增至摘要。 - 請注意,這需要 - matplotlib套件。
 - add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)[source]¶
- 將影片數據添加到摘要。 - 請注意,這需要使用 - moviepy套件。- 參數
 - 形狀
- vid_tensor: 。對於 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) – 選擇性覆寫預設 walltime (time.time()),以事件時期後的秒數表示 
 
 - 形狀
- snd_tensor: 。值應介於 [-1, 1] 之間。 
 
 - add_text(tag, text_string, global_step=None, walltime=None)[source]¶
- 將文字數據添加到摘要。 - 參數
 - 範例 - 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.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)[source]¶
- 將嵌入式投影機數據添加到摘要。 - 參數
- mat (torch.Tensor 或 numpy.ndarray) – 每行都是數據點特徵向量的矩陣 
- metadata (list) – 標籤列表,每個元素都將轉換為字串 
- label_img (torch.Tensor) – 對應於每個數據點的影像 
- global_step (int) – 要記錄的全局步驟值 
- tag (str) – 嵌入的名稱 
- metadata_header (list) – 多欄中繼資料的標題列表。如果給定,則每個中繼資料都必須是與標題相對應的值列表。 
 
 - 形狀
- 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) - 注意 - 如果要在嵌入式投影機中使用類別(即非數值)中繼資料進行著色,則唯一值不能超過 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) – 元素被分類為 True 的概率。值應介於 [0, 1] 之間 
- global_step (int) – 要記錄的全局步驟值 
- num_thresholds (int) – 用於繪製曲線的閾值數量。 
- 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)[原始碼]¶
- 透過收集「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)[原始碼]¶
- 將網格或 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()),以事件時期後的秒數表示 
 
 - 形狀
- 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)[原始碼]¶
- 添加一組要在 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}) - 預期結果 