这段代码遵循了深度学习的标准流水线:数据处理 -> 模型构建 -> 训练循环 -> 测试评估。
1. 数据预处理模块 (Data Pipeline)
Python
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
ToTensor(): 这是最关键的一步。它将 PIL 图片或 Numpy 数组(0-255)转换为FloatTensor,并将像素值缩放到[0.0, 1.0]之间。同时,它会自动将形状从(H, W, C)转换为 PyTorch 要求的(C, H, W)。Normalize: 使用 MNIST 数据集的全局均值(0.1307)和标准差(0.3081)进行标准化。这能让模型收敛更快,避免梯度爆炸或消失。DataLoader: 它是数据的“传送带”。batch_size=64意味着每次给模型喂 64 张图,shuffle=True保证模型不会因为记住了图片的出现顺序而产生过拟合。
2. 卷积神经网络模块 (The Architecture)
这一部分定义了大脑的“结构”。
Python
class TinyCNN(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(1, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
# ... 更多层 ...
nn.Flatten(),
nn.Linear(32 * 7 * 7, 128), nn.ReLU(),
nn.Linear(128, 10)
)
Conv2d(卷积层):这是提取特征的核心。它像一个滤镜在图片上滑动,寻找边缘、弧线等形状。ReLU(激活函数):引入非线性变换。没有它,无论多少层神经网络都只是一个复杂的线性方程,无法处理复杂的图像。MaxPool2d(池化层):通过取 $2 \times 2$ 窗口内的最大值,将图片尺寸减半(28->14->7)。这能减少计算量并提取最重要的特征。Flatten: 将二维的特征图(Feature Map)摊平一维向量,以便输入给最后的全连接层(Linear)。Linear(128, 10): 最后一层输出 10 个神经元,对应数字 0-9 的概率得分。
3. 训练核心逻辑 (The Training Loop)
这是模型“学习”的过程。
Python
model.train() # 切换到训练模式
for data, target in train_loader:
optimizer.zero_grad() # 1. 清空旧梯度
output = model(data) # 2. 前向传播:得到预测值
loss = criterion(output, target) # 3. 计算误差:预测值与真实标签的差距
loss.backward() # 4. 反向传播:计算每个参数对误差的“贡献”
optimizer.step() # 5. 更新参数:沿着误差减小的方向挪一小步
CrossEntropyLoss: 交叉熵损失函数。对于分类问题(0-9 分类),这是标准配置。Adam优化器: 一种自适应学习率的优化算法,通常比传统的 SGD(随机梯度下降)跑得更稳、更快。
4. 测试与评估模块 (Evaluation)
这是考试阶段,验证模型在没见过的数据上的表现。
Python
model.eval() # 切换到预测模式
with torch.no_grad(): # 关键:预测时不需要计算梯度,节省内存和速度
for data, target in test_loader:
output = model(data)
# argmax(1) 找到 10 个输出中得分最高的那一个作为预测数字
correct += (output.argmax(1) == target).sum().item()
argmax(1): 模型输出的是 10 个数(例如数字 3 的得分最高),我们取索引值作为预测结果。no_grad(): 告诉 PyTorch 此时不需要记录计算图,这能让测试过程运行得非常丝滑。





