问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

TensorBoard基本使用及案例详解

创作时间:
作者:
@小白创作中心

TensorBoard基本使用及案例详解

引用
CSDN
1.
https://blog.csdn.net/qq_52964132/article/details/145412008

TensorBoard是TensorFlow和PyTorch等深度学习框架中常用的可视化工具,能够帮助开发者直观地监控和理解模型训练过程中的各种指标。本文将详细介绍TensorBoard的基本使用方法,并通过多个实际案例展示其在机器学习项目中的具体应用。

基本使用

  1. 安装
  • 安装TensorBoard:

    pip install tensorboard
    
  • 如果使用PyTorch,还需要安装torchtorchvision

    pip install torch torchvision
    
  1. 启动TensorBoard

在命令行中运行以下命令启动TensorBoard:

tensorboard --logdir=runs

其中--logdir指定日志文件所在的目录。

  1. 在代码中使用TensorBoard

PyTorch示例:以下是一个简单的线性回归模型,使用TensorBoard记录训练过程中的损失值。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import matplotlib.pyplot as plt

# 生成数据
x = np.random.rand(100, 1) * 20
y = 3 * x + np.random.randn(100, 1) * 5

# 转换为Tensor
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y)

# 定义线性模型
model = nn.Linear(1, 1)

# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 初始化TensorBoard
writer = SummaryWriter('runs/linear_regression')

# 训练模型
for epoch in range(100):
    model.train()
    optimizer.zero_grad()
    outputs = model(x_tensor)
    loss = criterion(outputs, y_tensor)
    loss.backward()
    optimizer.step()

    # 记录损失
    writer.add_scalar('Loss/train', loss.item(), epoch)

# 关闭TensorBoard
writer.close()

# 绘制真实与预测数据
plt.figure(figsize=(10, 6))
plt.scatter(x, y, label='Data', color='blue')
plt.plot(x, model(x_tensor).detach().numpy(), label='Prediction', color='red')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Linear Regression')
plt.grid()
plt.show()

在浏览器中访问http://localhost:6006,可以看到实时的训练损失变化曲线。

  1. TensorBoard的可视化功能
  • 标量可视化:使用add_scalar方法记录标量数据,如损失值或准确率。
  • 图像可视化:使用add_image方法记录图像数据。
  • 直方图可视化:使用add_histogram方法记录直方图数据。
  • 图形可视化:使用add_graph方法记录模型的计算图。
  • 嵌入可视化:使用add_embedding方法记录嵌入数据。

案例

  1. 记录训练过程中的标量数据

在PyTorch中,可以使用SummaryWriteradd_scalar方法记录训练过程中的损失值和准确率。

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)
writer.close()

在TensorBoard中,这些标量数据会被分组显示,便于比较训练和测试阶段的性能。

  1. 记录模型的计算图

在PyTorch中,可以使用add_graph方法记录模型的计算图。

from torch.utils.tensorboard import SummaryWriter
import torchvision
from torchvision import datasets, transforms

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)
model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
images, labels = next(iter(trainloader))
writer.add_graph(model, images)
writer.close()

在TensorBoard中,可以查看模型的计算图,了解模型的结构。

  1. 记录嵌入数据

在PyTorch中,可以使用add_embedding方法记录嵌入数据。

from torch.utils.tensorboard import SummaryWriter
import torch

writer = SummaryWriter()
meta = []
while len(meta) < 100:
    meta = meta + keyword.kwlist
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.close()

在TensorBoard中,嵌入数据(embedding)通常用于可视化高维数据的低维投影,例如通过t-SNE或PCA方法。以下是一个完整的案例,展示如何在PyTorch中记录嵌入数据并使用TensorBoard进行可视化。

完整代码示例

from torch.utils.tensorboard import SummaryWriter
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
from torchvision import datasets, transforms
import numpy as np

# 设置TensorBoard
writer = SummaryWriter('runs/embedding')

# 数据预处理
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)

# 定义一个简单的模型
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 输入是28x28的图像
        self.fc2 = nn.Linear(128, 10)  # 输出是10类

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 将图像展平
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNet()

# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    model.train()
    for batch_idx, (data, target) in enumerate(trainloader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

        # 每隔一定步数记录一次嵌入数据
        if batch_idx % 100 == 0:
            # 获取嵌入层的输出
            embedding = model.fc1(data.view(-1, 28 * 28)).detach().numpy()
            # 获取标签
            labels = target.numpy()
            # 记录嵌入数据
            writer.add_embedding(
                mat=embedding,
                metadata=labels,
                label_img=data.unsqueeze(1),
                global_step=epoch * len(trainloader) + batch_idx
            )
            print(f"Epoch {epoch}, Batch {batch_idx}, Loss: {loss.item()}")

writer.close()
  • 模型定义

  • 定义了一个简单的全连接网络,包含两个全连接层。fc1的输出可以作为嵌入数据。

  • 嵌入数据记录

  • 使用add_embedding方法记录嵌入数据。mat参数是嵌入数据,metadata是标签,label_img是对应的图像数据。

  • 在训练过程中,每隔一定步数(例如每100步)记录一次嵌入数据。

  • TensorBoard可视化

  • 启动TensorBoard:

    tensorboard --logdir=runs
    
  • 在浏览器中访问http://localhost:6006,进入Embeddings选项卡,可以看到嵌入数据的可视化结果。通过t-SNE或PCA方法,可以将高维嵌入数据投影到低维空间,观察数据的分布情况。

总结

TensorBoard是一个强大的可视化工具,可以帮助我们更好地理解模型的训练过程和结果。通过记录标量、图像、直方图、嵌入数据等信息,我们可以在训练过程中实时观察模型的性能,调整训练策略,优化模型结构。

其他案例

  1. 图像可视化

在训练过程中,可以记录中间层的输出图像或输入图像,用于观察模型的特征提取效果。

writer = SummaryWriter('runs/image_visualization')
# 假设data是输入图像,output是模型的某个中间层输出
writer.add_image('input', data[0], global_step=epoch)
writer.add_image('output', output[0], global_step=epoch)
writer.close()
  1. 直方图可视化

记录模型参数的分布情况,有助于分析模型的训练状态。

writer = SummaryWriter('runs/histogram_visualization')
# 假设model是模型对象
for name, param in model.named_parameters():
    writer.add_histogram(name, param, global_step=epoch)
writer.close()
  1. 自定义图表

TensorBoard支持自定义图表,可以通过add_custom_scalars方法定义多条曲线的组合视图。

writer = SummaryWriter('runs/custom_scalars')
# 定义自定义图表
writer.add_custom_scalars_multilinechart(['Loss/train', 'Loss/test'])
writer.add_custom_scalars_marginchart(['Accuracy/train', 'Accuracy/test'])
# 记录数据
for epoch in range(100):
    writer.add_scalar('Loss/train', np.random.random(), epoch)
    writer.add_scalar('Loss/test', np.random.random(), epoch)
    writer.add_scalar('Accuracy/train', np.random.random(), epoch)
    writer.add_scalar('Accuracy/test', np.random.random(), epoch)
writer.close()
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号