共计 2131 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
卷积神经网络(CNN)是计算机视觉领域的基石,能够自动提取图像的层次化特征。对于初学者来说,AlexNet 和 LeNet 是两个极好的入门模型:

- LeNet-5(1998 年):首个成功应用于手写数字识别的 CNN,结构简单清晰
- AlexNet(2012 年):ImageNet 竞赛冠军,引入了 ReLU、Dropout 等现代 CNN 关键技术
选择这两个模型学习,可以:
1. 理解 CNN 从传统到现代的演进
2. 掌握基础层(卷积、池化)到高级技巧(局部响应归一化)的实现
3. 建立对不同规模网络性能差异的直观认识
模型对比
网络结构差异
- LeNet-5(约 6 万参数)
- 输入层 → 卷积层 → 池化层 → 卷积层 → 池化层 → 全连接层 → 输出
-
使用 tanh 激活函数
-
AlexNet(约 6000 万参数)
- 5 个卷积层 + 3 个全连接层
- 引入 ReLU 激活函数
- 使用局部响应归一化(LRN)
- 首次应用 Dropout
适用场景
- LeNet:适合处理小尺寸(如 28×28)简单图像
- AlexNet:适用于更大尺寸(如 224×224)的复杂图像分类
核心实现(PyTorch 版)
LeNet 实现关键代码
import torch.nn as nn
class LeNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5) # 输入通道 1,输出 6,5x5 卷积核
self.pool = nn.AvgPool2d(2, 2) # 2x2 平均池化
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*4*4, 120) # 全连接层需计算展平后尺寸
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.tanh(self.conv1(x)))
x = self.pool(F.tanh(self.conv2(x)))
x = x.view(-1, 16*4*4) # 展平操作
x = F.tanh(self.fc1(x))
x = F.tanh(self.fc2(x))
x = self.fc3(x)
return x
AlexNet 核心改进点
# AlexNet 特有的 LRN 层实现
class AlexNet(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(nn.Conv2d(3, 64, 11, 4, 2), # 输入 3 通道,输出 64,11x11 核
nn.ReLU(inplace=True),
nn.MaxPool2d(3, 2), # 3x3 最大池化
nn.LocalResponseNorm(5), # LRN 层
# ... 其他卷积层
)
self.classifier = nn.Sequential(nn.Dropout(), # Dropout 层
nn.Linear(256*6*6, 4096),
nn.ReLU(inplace=True),
# ... 其他全连接层
)
训练技巧
数据预处理
- 标准化:对图像进行(x – mean)/std 归一化
- 数据增强(AlexNet 特别需要):
- 随机裁剪
- 水平翻转
- 颜色抖动
优化器配置
# LeNet 适用配置
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# AlexNet 推荐配置
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
避坑指南
- 输入尺寸错误:
- 问题:卷积后特征图尺寸计算错误导致全连接层报错
-
解决:使用
torch.nn.functional的conv2d函数预先计算尺寸 -
梯度消失:
- 现象:LeNet 使用 tanh 时训练停滞
-
方案:改用 ReLU 或适当减小学习率
-
显存不足:
-
AlexNet 训练时需要减小 batch_size(如从 256 降到 64)
-
过拟合:
- 对 LeNet 添加 Dropout 层(原版没有)
-
对 AlexNet 增大 Dropout 比率(如 0.5→0.7)
-
LRN 层效果不佳:
- 现代实现通常用 BatchNorm 替代 LRN
性能评估
| 模型 | MNIST 准确率 | CIFAR-10 准确率 | 训练时间(epoch) |
|---|---|---|---|
| LeNet-5 | 99.2% | 68.5% | 3 分钟 |
| AlexNet | 99.4% | 82.3% | 25 分钟 |
测试环境:RTX 3060 GPU,batch_size=128
进阶建议
- 模型压缩:
- 尝试量化 AlexNet(如 8 位整数量化)
-
对 LeNet 进行剪枝实验
-
架构改进:
- 在 LeNet 中添加 BatchNorm 层
-
将 AlexNet 的 LRN 替换为 BatchNorm
-
扩展阅读:
- 论文《ImageNet Classification with Deep Convolutional Neural Networks》
- 书籍《Deep Learning for Computer Vision》
实践任务
- 在 LeNet 基础上:
- 将 tanh 激活函数替换为 ReLU
- 添加 BatchNorm 层
-
观察准确率变化
-
对 AlexNet:
- 移除所有 LRN 层
- 使用 BatchNorm 替代
- 比较训练速度差异
期待大家在评论区分享实验结果!遇到问题也可以随时提问,我会定期解答常见问题。
正文完
发表至: 未分类
近一天内
