1、Tensorboard介紹
??TensorBoard 是 TensorFlow 開發的一個可視化工具,用于幫助用戶理解和調試機器學習模型的訓練過程。盡管它最初是為 TensorFlow 設計的,但通過 PyTorch 的 torch.utils.tensorboard 模塊,PyTorch 用戶也可以方便地使用 TensorBoard 來記錄和可視化模型訓練中的各種數據(記得先安裝tensorboard包,pytorch不自帶)。
??SummaryWriter 是 PyTorch 中與 TensorBoard 交互的核心類,用于將數據寫入日志文件,供 TensorBoard 解析和展示。
1.1 TensorBoard 的核心功能
-
訓練指標可視化:
記錄損失(Loss)、準確率(Accuracy)、學習率(Learning Rate)等標量數據,并繪制曲線。 -
模型結構可視化:
展示神經網絡的計算圖(模型結構)。 -
直方圖和分布:
可視化權重、梯度等張量的分布變化。 -
圖像和音頻:
記錄輸入圖像、生成樣本或中間特征圖。 -
嵌入向量可視化:
對高維數據進行降維(如 PCA 或 t-SNE),展示在 2D/3D 空間中的分布。
1.2 SummaryWriter 的基本用法
- 初始化 SummaryWriter
from torch.utils.tensorboard import SummaryWriter# 創建 SummaryWriter 對象
writer = SummaryWriter(log_dir="runs/experiment_1")
參數:
- log_dir:日志文件的保存路徑(默認生成 runs/ 目錄下的時間戳文件夾)。
- 記錄標量數據(Scalars)
for epoch in range(100):loss = train_model()accuracy = calculate_accuracy()# 記錄損失和準確率writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)
- 記錄圖像(Images)
images, _ = next(iter(dataloader))
writer.add_images("Input_images", images, epoch)
- 記錄直方圖(Histograms)
weights = model.layer.weight.data
writer.add_histogram("Weights/layer", weights, epoch)
- 記錄模型結構(Graph)
dummy_input = torch.randn(1, 3, 224, 224) # 輸入示例
writer.add_graph(model, dummy_input)
- 關閉 Writer
writer.close()
1.3 啟動 TensorBoard
在命令行中運行以下命令啟動 TensorBoard:
tensorboard --logdir=runs/
然后通過瀏覽器訪問 http://localhost:6006 查看可視化結果。
1.4 關鍵方法詳解
常用方法
方法 | 功能 |
---|---|
add_scalar(tag, scalar_value, global_step) | 記錄單個標量(如 Loss) |
add_scalars(main_tag, tag_scalar_dict, global_step) | 記錄多個標量(如 Loss 和 Accuracy) |
add_image(tag, img_tensor, global_step) | 記錄單張圖像(格式需為 CxHxW) |
add_images(tag, img_tensor, global_step) | 記錄多張圖像(格式為 NxCxHxW) |
add_histogram(tag, values, global_step) | 記錄張量分布直方圖 |
add_graph(model, input_to_model) | 記錄模型計算圖 |
1.5 使用示例
import torch
from torch.utils.tensorboard import SummaryWriter# 初始化
writer = SummaryWriter("runs/demo")# 模擬訓練過程
for epoch in range(100):# 假設訓練邏輯loss = 1.0 / (epoch + 1)accuracy = 0.8 - 0.002 * epoch# 記錄標量writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)# 記錄隨機直方圖weights = torch.randn(100)writer.add_histogram("Random_weights", weights, epoch)# 記錄模型結構(假設 model 已定義)
dummy_input = torch.randn(1, 3, 224, 224)
writer.add_graph(model, dummy_input)# 關閉 Writer
writer.close()
1.6 注意事項
-
數據頻率:
避免在每個訓練步(step)都記錄大量數據,否則日志文件會過大。 -
實驗管理:
使用不同的 log_dir 區分不同實驗(如 runs/exp1, runs/exp2)。 -
張量格式:
圖像數據需符合 CxHxW 格式(通道優先)。 -
性能影響:
高頻記錄可能影響訓練速度,需權衡監控需求與效率。
1.7 總結
- TensorBoard 是模型訓練可視化的標準工具,支持標量、圖像、直方圖等多種數據。
- SummaryWriter 是 PyTorch 與 TensorBoard 的橋梁,通過簡單的方法將數據寫入日志。
- 典型工作流程:
記錄數據 → 啟動 TensorBoard → 瀏覽器查看 → 分析優化模型。
通過結合 TensorBoard 和 SummaryWriter,可以直觀地監控模型訓練過程,快速定位問題(如過擬合、梯度消失等),是深度學習開發中的必備技能。
2、Tensorboard實操
2.1 測試Tensorboard
2.1.1 add_scalar 函數介紹
??將單個標量值(如損失、準確率、學習率)記錄到 TensorBoard 日志中,生成隨時間/步驟變化的曲線圖,便于可視化分析。
基本語法
add_scalar(tag, scalar_value, global_step=None, walltime=None)
參數說明
tag (字符串)
- 標識數據的標簽,決定在 TensorBoard 中的圖表標題和分組。
- 支持層級命名(如 “train/loss” 和 “val/loss”),TensorBoard 會自動按斜杠分組顯示。
scalar_value (浮點數或標量張量)
- 要記錄的具體數值(如 loss.item() 或 accuracy)。
global_step (整數, 可選)
- 當前記錄的“步驟”,通常是迭代次數、epoch 數或自定義的計數器。
- 作為曲線的橫坐標,需確保遞增以正確顯示變化趨勢。
walltime (浮點數, 可選)
- 覆蓋默認的時間戳(記錄時刻),一般無需手動設置。
示例代碼
from torch.utils.tensorboard import SummaryWriter# 創建 SummaryWriter,日志保存到 runs/test 目錄
writer = SummaryWriter("runs/test")for i in range(100):# 記錄 y=3x 的標量值:tag為"y=3x",值為3*i,步驟為iwriter.add_scalar("y=3x", 3 * i, i)writer.close() # 關閉寫入器,確保數據保存
- tag=“y=3x”:在 TensorBoard 中生成名為 y=3x 的曲線圖。
- scalar_value=3*i:每次迭代記錄的值(模擬 y=3x 函數)。
- global_step=i:橫軸表示迭代步驟,從 0 到 99 遞增。
使用建議
命名規范
- 使用清晰的層級標簽(如 “train/loss”、“val/accuracy”)以便在 TensorBoard 中分類查看。
步驟連續性
- global_step 應單調遞增(如 0,1,2,…),避免跳躍或重復,否則圖表可能混亂。
高效記錄
- 避免高頻調用(如每個 batch 都記錄),可每隔若干步記錄一次以減少開銷。
查看結果
運行后,使用以下命令啟動 TensorBoard:
tensorboard --logdir=runs/test
在瀏覽器中打開提示的鏈接,即可看到 y=3x 的線性增長曲線。
注意事項
- 路徑引號問題:確保路徑字符串使用英文引號(如 “runs/test”),而非中文引號“”或‘’。
- 及時關閉 Writer:調用 writer.close() 或在 with 塊中使用,防止日志未保存。
相關方法
add_scalars:同時記錄多個標量(如訓練和驗證損失對比):
writer.add_scalars("loss", {"train": train_loss, "val": val_loss}, epoch)
其他記錄方法:如 add_image(記錄圖像)、add_histogram(權重分布)等,用于多維數據可視化。
2.1.2 實例
from torch.utils.tensorboard import SummaryWriter# 創建一個 SummaryWriter 對象
writer = SummaryWriter("runs/test")
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()
??運行上述程序之后,會發現程序所在目錄中多了個文件夾runs,文件夾runs中有一個文件夾test:
??如果想要查看可視化結果,可以在終端執行命令:
tensorboard --logdir=runs/
在這里,logdir=事件文件所在的文件夾,在本例中為logdir=test(注意不是logdir = runs/test,只能是一級目錄):
tensorboard --logdir=test
運行之后,返回結果:
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)
點擊網址,即可查看可視化結果。
如果打開網址看不到你的數據結果,嘗試把相對路徑(test)換為絕對路徑再重新運行并打開網址即可。
??另外,如果想要更改端口號(即上面網址中的6006),可以在終端執行以下命令:
tensorboard --logdir=test --port=6007
2.2 讀取圖像數據
2.2.1 add_jmage函數介紹
??SummaryWriter 中的 .add_image 方法用于將圖像數據記錄到 TensorBoard 中,幫助用戶可視化訓練過程中的圖像變化。
基本語法
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
參數說明:
- tag (str): 圖像的名稱標識,用于在 TensorBoard 中分類顯示。
- img_tensor (Tensor): 圖像張量,支持多種格式(需通過 dataformats 指定)。
- global_step (int, 可選): 記錄的步驟(如訓練步數或 epoch),用于滑動查看圖像變化。
- walltime (float, 可選): 自定義時間戳,默認使用當前時間。
- dataformats (str, 可選): 圖像張量的格式,默認為 ‘CHW’(通道數 × 高度 × 寬度)。
圖像張量格式
常見格式:
- 單圖像:(C, H, W)(默認)或 (H, W, C)(需設置 dataformats=‘HWC’)。
- 灰度圖:(1, H, W) 或 (H, W)(需設置 dataformats=‘HW’)。
- 批量圖像:使用 .add_images 或 torchvision.utils.make_grid 合并為網格后記錄。
數據類型與范圍:
- 浮點型:數值范圍應為 [0.0, 1.0]。
- 整型(uint8):數值范圍應為 [0, 255]。
使用步驟
- 導入庫并創建 SummaryWriter:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
- 準備圖像張量:
從隨機數據生成:
img = torch.rand(3, 64, 64) # 3通道,64x64,范圍[0,1]
從文件加載并轉換:
from PIL import Image
import numpy as np
import torch# 讀取圖像并轉為張量
image = Image.open("example.jpg")
img_array = np.array(image)
if img_array.ndim == 3:img_tensor = torch.from_numpy(img_array.transpose(2, 0, 1)) # HWC → CHW
else:img_tensor = torch.from_numpy(img_array).unsqueeze(0) # 灰度圖添加通道維度
img_tensor = img_tensor.float() / 255.0 # 歸一化到[0,1]
- 記錄圖像:
writer.add_image('my_image', img_tensor, global_step=0)
- 處理多張圖像(網格):
import torchvisionimages = torch.randn(16, 3, 64, 64) # 16張圖像
grid = torchvision.utils.make_grid(images, nrow=4) # 合并為4x4網格
writer.add_image('16_images_grid', grid, 0)
注意事項
- 數據范圍:若張量值超出 [0, 1] 或 [0, 255],需手動歸一化:
img = (img - img.min()) / (img.max() - img.min()) # 歸一化到[0,1]
- 格式匹配:若張量形狀與 dataformats 不匹配,TensorBoard 可能無法正確顯示。
例如:(H, W, C) 需設置 dataformats=‘HWC’。單通道灰度圖 (H, W) 需設置 dataformats=‘HW’。 - GPU 張量:若張量在 GPU 上,需先移至 CPU:
img_tensor = img_tensor.cpu()
示例代碼
from torch.utils.tensorboard import SummaryWriter
import torchwriter = SummaryWriter()# 生成隨機圖像(3通道,64x64)
img = torch.rand(3, 64, 64)
writer.add_image('random_image', img, 0)# 記錄多張圖像的網格
images = torch.randn(16, 3, 64, 64)
grid = torchvision.utils.make_grid(images, nrow=4)
writer.add_image('image_grid', grid, 0)writer.close()
運行后,在命令行啟動 TensorBoard:
tensorboard --logdir=runs
通過以上步驟,可有效利用 .add_image 監控模型輸入、輸出或中間特征圖,提升訓練過程的可解釋性。
2.2.2 示例
??接下來使用SummaryWriter類中的.add_image()方法來讀取圖像數據。使用的圖像為.jpg格式文件:
由于PIL中Image.open()打開的圖片類型為<class ‘PIL.JpegImagePlugin.JpegImageFile’>,而方法add_image()中
img_tensor 參數必須為圖像張量: (torch.Tensor, numpy.ndarray, or string/blobname)
Args:tag (str): Data identifierimg_tensor (torch.Tensor, numpy.ndarray, or string/blobname): Image dataglobal_step (int): Global step value to recordwalltime (float): Optional override default walltime (time.time())seconds after epoch of eventdataformats (str): Image data format specification of the formCHW, HWC, HW, WH, etc.
因此,使用img_array = np.array(img_PIL)將PIL類型圖像轉換為numpy.ndarray類型圖像。
>>> import numpy as np
>>> img_array = np.array(img_PIL)
>>> type(img_array)
<class 'numpy.ndarray'>
>>> img_array.shape
(512, 768, 3)
??此外,轉換為numpy.ndarray類型圖像之后,方法add_image()中參數dataformats (str, 可選): 圖像張量的格式,默認為 ‘CHW’(通道數 × 高度 × 寬度)。而轉換之后的格式為(H x W x C),因此需要設置該參數為dataformats=‘HWC’。
完整代碼:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image# 創建一個 SummaryWriter 對象
writer = SummaryWriter("runs")
image_path = "hymenoptera_data/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)writer.add_image("train", img_array, 1, dataformats='HWC')
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()
??在終端執行命令:
tensorboard --logdir=E:\my_pycharm_projects\project1\runs
運行:
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)
點擊網址,即可查看可視化結果: