共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。
作为卷积神经网络的开山之作,AlexNet 的 5 个卷积层 + 3 个全连接层结构在 ImageNet 竞赛中展现了强大特征提取能力。但当我们用较小数据集训练时,经常遇到训练准确率持续上升而验证准确率突然下跌的典型过拟合现象。

为什么 AlexNet 容易过拟合?
- 数据饥饿问题:当训练样本不足时(比如只有几千张图片),模型会强行记住训练集噪声而非学习通用特征
- 参数爆炸隐患 :第一个全连接层(FC6) 需要计算 256×6×6×4096=37,748,736 个权重,远超卷积层的参数量
- ReLU 的副作用:部分神经元可能因长时间负梯度输入而永久性死亡(Dead ReLU),导致网络容量下降
三大调优策略实战
数据增强:低成本扩充数据多样性
transform_train = transforms.Compose([transforms.RandomResizedCrop(224), # 随机区域裁剪并缩放
transforms.RandomHorizontalFlip(), # 50% 概率水平翻转
transforms.ColorJitter(0.2, 0.2, 0.2), # 颜色抖动增强
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
关键点:随机裁剪迫使模型关注局部特征,色彩抖动模拟光照变化,这些操作在 CPU 预处理阶段即可完成,几乎不增加 GPU 计算负担。
网络结构调整:狙击全连接层过拟合
原始 AlexNet 的 FC 层配置:
self.classifier = nn.Sequential(nn.Dropout(), # 默认 p =0.5
nn.Linear(256*6*6, 4096),
nn.ReLU(),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Linear(4096, num_classes)
)
调整方案:
1. 在最后一个全连接层前增加 Dropout 层(p=0.3)
2. 使用更激进的中间层 Dropout(p=0.6)
self.classifier = nn.Sequential(nn.Dropout(p=0.6), # 提高中间层丢弃率
nn.Linear(256*6*6, 4096),
nn.ReLU(),
nn.Dropout(p=0.6),
nn.Linear(4096, 2048), # 降低维度
nn.ReLU(),
nn.Dropout(p=0.3), # 末端使用较温和的丢弃
nn.Linear(2048, num_classes)
)
效果对比:在 CIFAR-10 测试中,原始结构验证准确率峰值 72%,调整后稳定在 78% 以上。
正则化:给权重加上紧箍咒
优化器配置示例:
optimizer = torch.optim.SGD(model.parameters(),
lr=0.01,
momentum=0.9,
weight_decay=0.001 # L2 正则化系数
)
参数选择经验:
– 当学习率设为 0.1 时,weight_decay 建议 0.005
– 使用 Adam 优化器时,建议降至 0.0001
效果验证
- loss 曲线对比:
- 原始模型:训练 loss 可降至 0.1 以下,验证 loss 在 20epoch 后反弹
- 调优后:训练 / 验证 loss 同步下降,最终差值小于 0.3
- 参数量变化:
- 原始:约 6000 万参数
- 调整后:全连接层参数量减少 37%
避坑指南
- 学习率与正则化的平衡:
- 过大的 weight_decay 会导致权重更新受阻,表现为 loss 下降缓慢
-
建议初始采用 1e- 4 的小系数,配合学习率衰减策略
-
BatchNorm 的陷阱:
model.eval() # 验证阶段必须设置!with torch.no_grad(): output = model(input) - 忘记切换 eval 模式会导致 BN 层继续更新统计量,引入噪声
延伸思考
当数据增强操作(如随机透视变换)导致 CPU 成为瓶颈时,可以考虑:
1. 使用 DALI 库实现 GPU 加速预处理
2. 采用多进程数据加载(num_workers=4~8)
3. 预生成增强样本到内存或 SSD
过拟合就像模型患上了 ” 应试教育综合征 ”,而本文介绍的方法相当于为其开出的组合处方。实际应用中可能需要根据具体任务调整药剂配比,但核心思路始终是:增加数据多样性、限制模型记忆能力、引导学习通用特征。
正文完
