郭震 AI公众号:郭震AI

15 PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现

发布日期:

最近更新:

分类: Pytorch小白

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点6 个
图文要点6 张
正文规模1.2k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

训练循环流程图查看大图
训练循环流程图

训练循环看似重复,但顺序很重要:前向计算、计算 loss、清梯度、反向传播、更新参数,再记录指标。

官方教程:PyTorch optimization

训练循环核对图查看大图
训练循环核对图

我会在每个 epoch 记录训练 loss、验证 loss 和学习率。没有日志,训练失败时只能猜。

在前一篇文章中,我们讨论了模型训练之选择优化器的内容,了解到不同的优化器在训练过程中对模型参数更新的方式有所不同。在这一篇中,我们将深入探讨如何实现一个完整的训练循环,以便在选定优化器的基础上进行模型训练。

训练循环的基本概念

训练循环是深度学习中最核心的部分之一,它负责执行模型的前向传播、计算损失、后向传播以及更新模型参数的过程。具体而言,一个训练循环一般包含以下几个步骤:

PyTorch训练循环判断卡查看大图
PyTorch训练循环判断卡

实现 PyTorch 训练循环时,先看 zero_grad、forward、loss、backward、step、指标记录和验证模式。

  1. 加载数据:从数据集加载一个批次的数据。
  2. 前向传播:将输入数据传递给模型,得到预测结果。
  3. 计算损失:与真实标签进行比较,计算损失值。
  4. 反向传播:计算损失的梯度。
  5. 优化器更新参数:根据计算得到的梯度更新模型的参数。
  6. 记录和输出:记录损失和性能指标,输出训练信息。

示例:实现训练循环

接下来,我们将通过具体的案例来实现一个简单的训练循环。假设我们正在训练一个用于图像分类的模型,使用的是 CIFAR-10 数据集。

PyTorch阅读地图卡查看大图
PyTorch阅读地图卡

学习《PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现》不必一口气吃完所有细节。先挑一个能动手验证的小问题,再顺着图和正文补齐概念。

1. 准备工作

首先,我们需要安装 PyTorch 和 torchvision,并导入必要的库:

pip install torch torchvision

然后,我们可以开始编写我们的代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

# 设置随机种子以确保结果可复现
torch.manual_seed(0)

# 超参数
learning_rate = 0.001
num_epochs = 5
batch_size = 64

# 数据预处理
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 加载数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                          download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
                                          shuffle=True, num_workers=2)

2. 定义模型

这里我们定义一个简单的卷积神经网络模型:

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(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)  # 展平
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 实例化模型
model = SimpleCNN()

3. 训练循环实现

下面是训练循环的具体实现:

# 选择优化器
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 损失函数
criterion = nn.CrossEntropyLoss()

for epoch in range(num_epochs):
    running_loss = 0.0
  
    for i, (inputs, labels) in enumerate(trainloader):
        # 将输入和标签移动到GPU (如果有的话)
        inputs, labels = inputs.to(device), labels.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个小批次输出一次
            print(f'Epoch [{epoch + 1}/{num_epochs}], Step [{i + 1}/{len(trainloader)}], Loss: {running_loss / 100:.4f}')
            running_loss = 0.0

在这个循环中,optimizer.zero_grad() 是用来清除前一个小批次的梯度,loss.backward() 将计算得到的梯度赋值给相应的参数,optimizer.step() 则执行多步优化更新当前参数。

PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现应用复盘卡查看大图
PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现应用复盘卡

如果《PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现》还没完全消化,可以从这张卡片的四个动作重新走一遍。

PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现应用检查卡查看大图
PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现应用检查卡

回看《PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

结论

本篇文章通过一个具体的案例,详细介绍了如何实现模型训练中的训练循环。将前一篇的优化器选择与当前的训练循环结合,我们能够全面理解模型训练的关键步骤。接下来,我们将在下一篇文章中深入讨论如何评估模型性能与调优。

保持对训练过程的关注,不断进行改进与提升,这是深度学习中的一项重要技能。继续学习,迎接下一篇文章的挑战吧!

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

PyTorch 小白从零学教程系列:只生成模型训练之训练循环的实现适合谁读?

这是 PyTorch 入门 系列第 15 / 20 篇,适合正在学习PyTorch 入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇PyTorch 入门教程要多久?

按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...