Skip to content

🧭 TensorBoard 全面学习路线

约 728 个字 76 行代码 预计阅读时间 5 分钟

我们会分模块进行讲解,每个模块包括:

  • 📘 功能介绍
  • 🧪 代码示例
  • 🔍 TensorBoard 页面展示
  • 🧠 典型应用场景

✅ 第1课:基本使用(标量指标的记录)

📘 功能介绍:

最基础的功能是记录标量,比如训练过程中的 lossaccuracy,方便你查看训练是否收敛。

🧪 代码示例:

以 PyTorch 为例:

Python
from torch.utils.tensorboard import SummaryWriter
import torch
import random

writer = SummaryWriter("runs/basic_scalars")

for epoch in range(100):
    loss = random.random()
    accuracy = 1 - loss
    writer.add_scalar("Loss/train", loss, epoch)
    writer.add_scalar("Accuracy/train", accuracy, epoch)

writer.close()

🔍 TensorBoard 页面展示:

  • 打开 Scalar 面板,你会看到两个图线:

  • Loss/train

  • Accuracy/train

🧠 应用场景:

  • 跟踪模型训练效果(Loss/Accuracy/学习率)
  • 比较不同实验(多个 runs)

✅ 第2课:记录计算图(模型结构可视化)

📘 功能介绍:

你可以将模型的前向传播图可视化,便于理解结构。

🧪 代码示例:

Python
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(10, 32),
            nn.ReLU(),
            nn.Linear(32, 2)
        )
    def forward(self, x):
        return self.net(x)

model = MyModel()
dummy_input = torch.randn(1, 10)

writer = SummaryWriter("runs/graph_example")
writer.add_graph(model, dummy_input)
writer.close()

🔍 TensorBoard 页面展示:

  • 打开 Graph 面板,会看到完整的模型图。

🧠 应用场景:

  • 快速验证模型结构
  • 给团队成员展示模型构成

✅ 第3课:记录模型参数(权重分布直方图)

📘 功能介绍:

你可以记录每一层的参数分布,查看训练过程中参数是否合理。

🧪 代码示例:

Python
model = nn.Linear(10, 2)
writer = SummaryWriter("runs/param_hist")

for epoch in range(100):
    for name, param in model.named_parameters():
        writer.add_histogram(name, param, epoch)

writer.close()

🔍 TensorBoard 页面展示:

  • 打开 Histograms 面板,可以看到随训练过程模型参数分布的演变。

🧠 应用场景:

  • 监控训练是否出现梯度爆炸/消失
  • 观察模型收敛趋势

✅ 第4课:记录图像(训练样本、可视化结果)

📘 功能介绍:

将图像输入、预测结果可视化,可以帮助你 debug 或展示效果。

🧪 代码示例:

Python
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose([transforms.ToTensor()])
dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=16, shuffle=True)

images, labels = next(iter(dataloader))
img_grid = torchvision.utils.make_grid(images)

writer = SummaryWriter("runs/images")
writer.add_image("mnist_images", img_grid)
writer.close()

🔍 TensorBoard 页面展示:

  • 打开 Images 面板,显示采样图像(如 MNIST)

🧠 应用场景:

  • 验证数据预处理结果
  • 对比预测结果与真实标签(语义分割、生成图像)

✅ 第5课:高阶功能(投影嵌入 Embeddings)

📘 功能介绍:

你可以用 TensorBoard 的 Projector 查看高维嵌入的投影,比如 Word Embedding、Image Embedding。

🧪 代码示例:

Python
import numpy as np
from torch.utils.tensorboard import SummaryWriter

features = torch.randn(100, 64)  # 100个样本,64维特征
labels = [str(i % 10) for i in range(100)]  # 假设是0-9的标签

writer = SummaryWriter("runs/embeddings")
writer.add_embedding(features, metadata=labels)
writer.close()

🔍 TensorBoard 页面展示:

  • 打开 Projector 面板,可以查看2D/3D嵌入投影图。

🧠 应用场景:

  • 可视化分类器输出、词向量分布
  • 检查样本聚类、模型分离能力

✅ 第6课:多实验对比(命名不同 runs)

📘 功能介绍:

你可以记录多个实验到不同子目录,然后同时在 TensorBoard 中比较它们。

🧪 代码示例:

Python
writer1 = SummaryWriter("runs/exp1")
writer2 = SummaryWriter("runs/exp2")

for epoch in range(100):
    writer1.add_scalar("Loss/train", 1 / (epoch+1), epoch)
    writer2.add_scalar("Loss/train", 0.8 / (epoch+1), epoch)

writer1.close()
writer2.close()

然后:

Python
from tensorboard import program

tb = program.TensorBoard()
tb.configure(argv=[None, '--logdir=runs'])
tb.launch()

🔍 TensorBoard 页面展示:

  • 你会看到 Loss/train 有两条线,一条来自 exp1,一条来自 exp2

🧠 应用场景:

  • 对比不同超参数
  • 对比不同模型结构
  • 汇总实验结果

🚀 实用技巧 & 建议

技巧 说明
使用 runs/实验名 做目录管理 方便后期对比多个实验
写日志的时候尽量用语义清晰的 tag,如 train/lossval/accuracy 方便在 TensorBoard 中分组
每次训练开始前清理旧日志(shutil.rmtree('runs') 避免旧日志混淆
TensorBoard 日志记录不应太频繁 每几个 step 或每个 epoch 记录一次即可,避免文件膨胀