共计 1772 个字符,预计需要花费 5 分钟才能阅读完成。
一、数学基础:理解卷积运算
卷积神经网络的数学本质是 离散卷积运算。对于输入图像 $I$(尺寸 $H×W$)和卷积核 $K$(尺寸 $k_h×k_w$),输出特征图 $O$ 的计算公式为:

$$ O(i,j) = \sum_{m=0}^{k_h-1}\sum_{n=0}^{k_w-1} I(i+m, j+n) \cdot K(m,n) $$
根据边界处理方式不同,有三种 padding 模式:
- Valid 模式:不填充,输出尺寸为 $(H-k_h+1)×(W-k_w+1)$
- Same 模式:填充使输出尺寸与输入相同,需满足 $pad=\lfloor k_h/2 \rfloor$
- Full 模式:最大填充,输出尺寸为 $(H+k_h-1)×(W+k_w-1)$
二、网络架构解剖:LeNet- 5 实例
以经典 LeNet- 5 结构为例(输入 32×32 灰度图):
- Conv1:5×5 卷积,6 个通道(参数共享机制)
nn.Conv2d(1, 6, kernel_size=5, stride=1) # 输出 6×28×28 - Pool1:2×2 最大池化
nn.MaxPool2d(kernel_size=2, stride=2) # 输出 6×14×14 - Conv2:5×5 卷积,16 个通道
- FC 层:最终输出 10 类概率
感受野计算公式:$RF_{l+1} = RF_l + (k-1)×\prod_{i=1}^l s_i$
三、PyTorch 实战代码
完整 CNN 类实现:
import torch.nn as nn
class LeNet(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(nn.Conv2d(3, 6, 5), # CIFAR-10 有 3 通道
nn.ReLU(),
nn.MaxPool2d(2, 2),
nn.Conv2d(6, 16, 5),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.classifier = nn.Sequential(nn.Linear(16*5*5, 120),
nn.ReLU(),
nn.Linear(120, 84),
nn.ReLU(),
nn.Linear(84, 10)
)
def forward(self, x):
x = self.features(x) # B×3×32×32 → B×16×5×5
x = torch.flatten(x, 1)
return self.classifier(x)
四、训练技巧与调试
-
参数量统计:
from torchsummary import summary model = LeNet().to('cuda') summary(model, (3, 32, 32)) # 显示各层参数 -
学习率衰减策略:
optimizer = torch.optim.SGD(model.parameters(), lr=0.1) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=200) -
TensorBoard 监控:
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() # 在训练循环中添加:writer.add_scalar('Loss/train', loss.item(), epoch) writer.add_scalar('Accuracy/test', accuracy, epoch)
五、常见问题解决方案
- 输入尺寸不匹配:检查数据预处理是否统一为 32×32
- 模型模式混淆:训练前调用
model.train(),验证时调用model.eval() - 梯度爆炸:添加梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) - 过拟合:使用 Dropout 层或数据增强
六、CIFAR-10 实战结果
经过 200 轮训练后:
- 训练准确率:89.2%
- 测试准确率:85.7%
关键改进点:
1. 添加 BatchNorm 层加速收敛
2. 使用 Adam 优化器替代 SGD
3. 采用随机水平翻转数据增强
完整训练代码可在 Colab Notebook 中运行,建议读者尝试调整超参数观察效果变化。通过本实践,相信你已掌握 CNN 的核心实现逻辑,接下来可以挑战更复杂的 ResNet 等现代架构。
正文完
