本课目标
掌握 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()
新手三大坑(我都踩过,帮你绕开)
- 忘记
zero_grad()——PyTorch 默认梯度累加,不手动清空的话 loss 会爆炸。这不是 bug,是设计选择(方便 RNN 等需要梯度累加的场景),但新手必备。 - 评估时没切
model.eval()+torch.no_grad()——Dropout 还在随机关神经元、显存白白占用。测试集上的准确率会偏低且不稳定。 - 数据忘了
.to(device)——模型在 GPU 上,数据还在 CPU 上。报错信息不直观,但只要牢记"张量要在跟模型同一个 device 上"就不会再犯。
框架选型建议(2026 版)
PyTorch 一家独大,新项目优先选它。快速原型、移动端部署(TFLite)仍可考虑 Keras——但如果你只学一个框架,PyTorch。
动手练习
- 跑通 Fashion-MNIST,测试集准确率应达 88%+
- 故意删掉
zero_grad(),观察 loss 曲线从正常到爆炸的过程