一个 PyTorch 模型训练的完整流程

从准备数据、定义模型、选择损失函数和优化器,到训练循环和验证评估,把 PyTorch 训练主线串起来。

学习路线:AI 入门与 PyTorch 基础(1~20) · 第 18 课
第 18 课一组训练流程节点从数据、模型、损失函数连接到优化器,屏幕上有训练曲线。
Learning Path

AI 入门与 PyTorch 基础(1~20)

从 AI 基本概念、机器学习任务、深度学习直觉、PyTorch 入门到中文文本分类项目全貌。

学完本阶段你能做到:能说清 AI、机器学习、深度学习、PyTorch 训练流程和一个中文文本分类项目的大致链路。

推荐读法:零基础建议顺序阅读;已有基础的读者可以把它当作路线地图和查漏补缺清单。

查看完整阶段 · 20 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「一个 PyTorch 模型训练的完整流程」解决的核心问题
  • 知道它在「AI 入门与 PyTorch 基础(1~20)」中的位置
  • 把 DataLoader、Linear 层、Pipeline 这些关键词联系起来

前置知识

  • 建议先读完上一篇:DataLoader 详解:批量读取、打乱、并行加载有什么用
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【DataLoader】DataLoader 负责把数据一批一批喂给模型,训练循环才不会手忙脚乱。 前面或后面会反复用到它。
  • 【Linear 层】Linear 层做的是矩阵乘法加偏置,是很多神经网络模块的基础零件。 前面或后面会反复用到它。
  • 【Pipeline】Pipeline 让项目不再散落成一堆临时代码,也能减少训练和预测时步骤不一致的问题。 前面或后面会反复用到它。
  • 【Tensor】可以先把 Tensor 理解成支持 GPU、梯度和批量计算的多维数组。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要只看 API 名字,要同时关注输入输出 shape 和训练流程。

课后练习

  • 用 3 句话向一个零基础朋友解释「一个 PyTorch 模型训练的完整流程」。
  • 打开概念库里的「DataLoader」,补一遍它和本文的关系。
  • 读下一课「从垃圾短信识别项目里,我复盘了一个中文文本分类系统」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 如果一段 PyTorch 代码报 device 不一致,第一步应该检查什么?

先检查模型参数、输入 Tensor、标签 Tensor 是否在同一个设备上。常见修正是把它们统一 `.to(device)`。

2. 为什么学习 PyTorch 时不能只看 API 名字?

因为训练是否正确经常取决于 shape、dtype、device 和梯度流,API 名字只能告诉你工具,不会保证数据契约正确。

3. 读完本文后,至少应该能画出哪条训练主线?

`输入数据 → forward → loss → backward → optimizer.step()`,并知道本文主题位于这条链路的哪一环。

下一步建议读「从垃圾短信识别项目里,我复盘了一个中文文本分类系统」。

学 PyTorch 时,单个概念看懂不难,真正容易乱的是完整训练流程。

这篇文章先不追求复杂模型,只把一条最基础的训练主线串起来。

第 18 课视频 · PyTorch 模型训练完整流程(约 1 分 42 秒)

第一步:准备数据

训练模型前,先要把数据整理成模型能吃的形式。

通常会经历几步:

  • 读取原始数据
  • 做必要的清洗和预处理
  • 转成 Tensor
  • 封装成 Dataset
  • 用 DataLoader 批量加载

如果数据这一步没处理好,后面模型再复杂也很难救回来。

第二步:定义模型

PyTorch 里通常会继承 nn.Module 定义模型:

from torch import nn

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(10, 2)

    def forward(self, x):
        return self.linear(x)

这里 __init__ 定义模型有哪些层,forward 定义数据怎么流过这些层。

第三步:选择损失函数

损失函数负责衡量模型预测错了多少。

分类任务常见:

loss_fn = nn.CrossEntropyLoss()

回归任务常见:

loss_fn = nn.MSELoss()

损失函数要和任务类型匹配,这一点很重要。

第四步:选择优化器

优化器负责根据梯度更新参数。

常见写法:

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

这里 model.parameters() 告诉优化器要更新哪些参数,lr 是学习率。

第五步:训练循环

最核心的训练循环通常长这样:

for x, y in train_loader:
    pred = model(x)
    loss = loss_fn(pred, y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

这几行非常重要。

可以按顺序理解:

  1. 前向传播,得到预测
  2. 计算 loss
  3. 清空旧梯度
  4. 反向传播,计算新梯度
  5. 优化器更新参数

这就是 PyTorch 训练模型的核心骨架。

第六步:验证模型

训练时还需要在验证集上观察效果。

验证阶段通常不需要计算梯度,所以会写:

model.eval()
with torch.no_grad():
    for x, y in val_loader:
        pred = model(x)

这样可以减少显存占用,也避免误更新模型。

小结

一个 PyTorch 训练流程可以压缩成这样:

数据 -> 模型 -> loss -> backward -> optimizer.step -> 验证

刚开始不要急着堆复杂结构。

先把这条主线真正跑通,后面再换模型、调参数、加可视化,都会轻松很多。

Discussion

留言讨论