项目地址:https://github.com/zhongqianli/caffe_resnet
《Deep Residual Learning for Image Recognition》的作者提出了ResNet,通过引入深度残差学习框架,解决了网络退化问题。核心思想是通过拟合残差映射取代拟合潜在的映射,前者比后者更容易优化。使用1x1 conv(bottleneck)降低了网络的计算复杂度。使用《Batch normalization: Accelerating deep network training by reducing internal covariate shift》提出的Batch normalization减少internal covariate shift,允许使用更大的学习率,不再需要小心翼翼地初始化参数。
解决的问题
通过引入深度残差学习框架,解决了退化问题。
退化问题(degradation problem):
随着网络深度的增加,精度达到饱和并且会迅速退化。退化并不是由过拟合引起的,给一个合适深度的网络增加更多层时,训练误差会增加。
解决方法
用堆叠的非线性层拟合残差映射F(x) := H(x) - x
,而不是直接拟合underlying映射H(x)
。原始的映射H(x)可重投射为F(x) + x
。F(x) + x
可以由前馈神经网络和"shortcut connections"(跳跃连接、快捷连接)来实现。在这篇paper中,shortcut connections仅仅充当恒等映射。恒等的shortcut connections既没有增加额外的参数也没有增加计算复杂度。
y = F(x, {Wi}) + x
y = F(x, {Wi}) + Wsx
残差方程F比较弹性,层数不小于2即可。
训练方法
数据增强
- 随机裁剪
- 水平翻转
- 对比度归一化
批归一化(batch normalization)
在每个卷积之后,激活之前使用批归一化
优化算法参数
mini-batch size = 256
SGD
lr = 0.1
lr policy
weight decay: 0.0001
momentum: 0.9
实验步骤
将cifar10数据库转换成lmdb数据库文件
用create_resnet.py生成训练测试网络文件,然后用github上的netscope检查生成的训练测试网络文件是否正确
用create_solver.py生成solver文件
用train_net.py进行模型训练
用caffe/tools下的log分析工具分析log文件,得到训练误差变化曲线和准确率变化曲线