本课目标

掌握 PyTorch 的核心抽象(Tensor、autograd、nn.Module、Dataset/DataLoader),完成 Fashion-MNIST 衣物分类,理解 PyTorch 与 Keras 的心智差异。


Keras 把训练循环藏进 model.fit()——方便,但你不知道里面发生了什么。PyTorch 把循环摊开给你看——初看啰嗦,实则给了你随时介入每个步骤的自由。本讲通过 Fashion-MNIST 实战,让你感受这种"显式控制"的力量。

核心内容

PyTorch vs Keras:自动挡 vs 手动挡

Keras 的 fit() 一行搞定训练——方便,出问题时一头雾水。PyTorch 的显式训练循环把"加载数据→前向传播→算 loss→反向传播→更新参数"每一步都亮给你,哪一步出问题直接定位。

研究界一边倒选 PyTorch 的原因不是"Keras 不好",是"我不知道哪里出了问题的时候,显式的代码就是最好的调试工具"。

两大基础设施

  • Dataset:定义"第 i 个样本长什么样",只关心单样本逻辑
  • DataLoader:批量、打乱、多进程加载——num_workers=2 并行读数据,训练不等待 IO
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,)),
])
train_set = datasets.FashionMNIST('./data', train=True, download=True, transform=transform)
test_set = datasets.FashionMNIST('./data', train=False, transform=transform)

train_loader = DataLoader(train_set, batch_size=64, shuffle=True, num_workers=2)
test_loader = DataLoader(test_set, batch_size=256)

class Classifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Flatten(),
            nn.Linear(784, 256), nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(256, 10),
        )
    def forward(self, x):
        return self.net(x)

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

for epoch in range(10):
    model.train()
    for X, y in train_loader:
        optimizer.zero_grad()
        loss = loss_fn(model(X), y)
        loss.backward()
        optimizer.step()

新手三大坑(我都踩过,帮你绕开)

  1. 忘记 zero_grad()——PyTorch 默认梯度累加,不手动清空的话 loss 会爆炸。这不是 bug,是设计选择(方便 RNN 等需要梯度累加的场景),但新手必备。
  2. 评估时没切 model.eval() + torch.no_grad()——Dropout 还在随机关神经元、显存白白占用。测试集上的准确率会偏低且不稳定。
  3. 数据忘了 .to(device)——模型在 GPU 上,数据还在 CPU 上。报错信息不直观,但只要牢记"张量要在跟模型同一个 device 上"就不会再犯。

框架选型建议(2026 版)

PyTorch 一家独大,新项目优先选它。快速原型、移动端部署(TFLite)仍可考虑 Keras——但如果你只学一个框架,PyTorch。

动手练习

  1. 跑通 Fashion-MNIST,测试集准确率应达 88%+
  2. 故意删掉 zero_grad(),观察 loss 曲线从正常到爆炸的过程