python打卡day45@浙大疏锦行
知识点回顾:
- tensorboard的发展历史和原理
- tensorboard的常见操作
- tensorboard在cifar上的实战:MLP和CNN模型
效果展示如下,很适合拿去组会汇报撑页数:
作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程。
一、TensorBoard的发展历史和原理
- 发展历史 :TensorBoard 最初是 TensorFlow 框架的可视化工具,随着深度学习的发展,它逐渐成为了一个独立且强大的可视化库,现在也支持 PyTorch 等其他深度学习框架。它帮助开发者更直观地理解、调试和优化深度学习模型。
- 原理 :TensorBoard 通过记录模型训练过程中的各种数据(如损失值、准确率、梯度等)到日志文件中,然后在本地启动一个 Web 服务器,读取这些日志文件并将数据以可视化的方式呈现出来。常见的可视化形式包括折线图、直方图、图像展示等。
二、TensorBoard的常见操作
- 记录标量数据 :用于记录训练过程中的损失值、准确率等标量指标。
- 记录图像数据 :可以展示训练数据、生成的图像等。
- 记录直方图 :用于可视化模型参数、梯度的分布。
- 启动 TensorBoard :在命令行中运行 tensorboard --logdir=path/to/logs ,然后在浏览器中访问相应的地址。
三、TensorBoard在 CIFAR 上的实战:MLP 和 CNN 模型
在训练 MLP 和 CNN 模型时,可以使用 torch.utils.tensorboard.SummaryWriter 来记录训练过程中的各种数据,然后使用 TensorBoard 进行可视化。以下是一个简单示例:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.tensorboard import SummaryWriter# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载 CIFAR10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,shuffle=True, num_workers=2)# 定义简单的 CNN 模型
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = self.pool(torch.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))x = self.fc3(x)return xmodel = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# 创建 SummaryWriter
writer = SummaryWriter('runs/cifar_experiment')for epoch in range(2): # 训练 2 个 epochrunning_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 2000 == 1999: # 每 2000 个 mini-batches 记录一次writer.add_scalar('Training Loss', running_loss / 2000, epoch * len(trainloader) + i)running_loss = 0.0writer.close()
作业:对 ResNet18 在 CIFAR10 上采用微调策略下,用 TensorBoard 监控训练过程
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torchvision.models import resnet18
from torch.utils.tensorboard import SummaryWriter
from config import Config # 假设使用当前工作区的 Config 类# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载 CIFAR10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=Config.BATCH_SIZE,shuffle=True, num_workers=2)testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=Config.BATCH_SIZE,shuffle=False, num_workers=2)# 加载预训练的 ResNet18 模型
model = resnet18(pretrained=Config.PRETRAINED)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, Config.NUM_CLASSES)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=Config.LR, momentum=0.9)# 创建 SummaryWriter
writer = SummaryWriter('runs/resnet18_cifar10_experiment')device = torch.device(Config.DEVICE)
model.to(device)for epoch in range(Config.EPOCHS):running_loss = 0.0model.train()for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99: # 每 100 个 mini-batches 记录一次writer.add_scalar('Training Loss', running_loss / 100, epoch * len(trainloader) + i)running_loss = 0.0# 在测试集上验证model.eval()correct = 0total = 0with torch.no_grad():for data in testloader:images, labels = data[0].to(device), data[1].to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / totalwriter.add_scalar('Test Accuracy', accuracy, epoch)writer.close()
在命令行中运行以下命令启动 TensorBoard
tensorboard --logdir=runs
然后查看可视化结果