?一、目的:為什么使用 TensorBoard 調控模型
使用 TensorBoard 可以幫我們:
-
實時查看 loss / acc 曲線 → 判斷是否過擬合、欠擬合;
-
對比不同模型或超參數的效果;
-
可視化模型結構 → 幫助調試模型設計;
-
查看權重/梯度分布 → 分析訓練穩定性;
-
可視化預測結果、特征圖、embedding → 提升模型可解釋性;
-
管理實驗結果、超參數組合。
二、訓練中可視化調控的功能詳解(附代碼)
?1. 可視化 loss / accuracy 曲線
writer.add_scalar("Loss/train", train_loss, epoch)
writer.add_scalar("Loss/val", val_loss, epoch)
writer.add_scalar("Acc/train", train_acc, epoch)
writer.add_scalar("Acc/val", val_acc, epoch)
?用途:
-
判斷訓練過程是否收斂;
-
驗證集 loss 高于訓練集 → 可能過擬合;
-
loss 一直不下降 → 學習率可能過高或模型設計問題。
2. 可視化模型結構
from torch.utils.tensorboard import SummaryWritermodel = MyModel()
dummy_input = torch.randn(1, 3, 224, 224)
writer.add_graph(model, dummy_input)
?用途:
-
檢查模型結構是否正確;
-
直觀看到各層連接順序。
?3. 可視化權重分布(Histogram)
for name, param in model.named_parameters():writer.add_histogram(name, param, epoch)
用途:
-
觀察參數值分布是否爆炸或消失;
-
梯度消失或爆炸時通常 histogram 變化異常。
?4. 可視化預測圖像、標簽、特征圖
import torchvision.utils as vutils# 展示輸入圖像和預測結果
writer.add_images("Input/Image", input_tensor, epoch)
writer.add_images("Predict/Output", output_tensor, epoch)
writer.add_images("GroundTruth/Label", label_tensor, epoch)
?用途:
-
視覺任務(如分割、分類)中快速檢查模型預測是否合理。
?5. 可視化 Embedding(高維向量降維)
# features: [N, D], labels: [N], images: [N, C, H, W]
writer.add_embedding(features, metadata=labels, label_img=images, global_step=epoch)
?用途:
-
檢查不同類別是否在特征空間中聚類良好;
-
Embedding 層是否學習到有效的表示。
?6. 超參數記錄與對比(add_hparams)
writer.add_hparams({'lr': 0.001, 'batch_size': 32},{'hparam/accuracy': acc, 'hparam/loss': loss}
)
?用途:
-
對比不同超參數下的模型效果;
-
自動生成匯總表格。
?7. 可視化學習率變化(學習率調度)
lr = optimizer.param_groups[0]['lr']
writer.add_scalar("LR", lr, epoch)
?用途:
-
學習率調度策略是否生效;
-
與 loss 的變化相互印證。
?三、訓練中綜合應用示例(完整代碼框架)
from torch.utils.tensorboard import SummaryWriter
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms# 準備
writer = SummaryWriter(log_dir='runs/exp1')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 數據
transform = transforms.ToTensor()
train_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('.', train=True, download=True, transform=transform),batch_size=64, shuffle=True)# 模型
model = nn.Sequential(nn.Flatten(),nn.Linear(28*28, 128),nn.ReLU(),nn.Linear(128, 10)
).to(device)# 損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 添加模型結構
writer.add_graph(model, torch.randn(1, 1, 28, 28).to(device))# 訓練
for epoch in range(5):total_loss = 0correct = 0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()_, predicted = outputs.max(1)correct += predicted.eq(labels).sum().item()avg_loss = total_loss / len(train_loader)accuracy = correct / len(train_loader.dataset)writer.add_scalar("Loss/train", avg_loss, epoch)writer.add_scalar("Acc/train", accuracy, epoch)writer.add_scalar("LR", optimizer.param_groups[0]['lr'], epoch)# 權重分布for name, param in model.named_parameters():writer.add_histogram(name, param, epoch)# 可視化輸入圖像img_grid = torchvision.utils.make_grid(images[:16].cpu())writer.add_image("Sample Inputs", img_grid, epoch)writer.close()
?四、進階建議
功能 | 說明 |
---|---|
多實驗對比 | 使用 SummaryWriter(log_dir=f"runs/lr_{lr}_bs_{bs}") 多次訓練 |
與 wandb 聯動 | 用 wandb 替代 TensorBoard,支持自動超參搜索 |
TensorBoard.dev | 上傳訓練記錄到云端,便于展示或記錄 |
?五、總結表格(常用 API)
功能 | API |
---|---|
標量值(loss) | add_scalar(tag, value, step) |
圖像 | add_image(tag, image_tensor, step) |
多圖像 | add_images(tag, batch_tensor, step) |
模型結構 | add_graph(model, input_tensor) |
參數直方圖 | add_histogram(tag, values, step) |
超參對比 | add_hparams(dict, metrics) |
Embedding | add_embedding(features, labels, images) |