论文阅读《Bag of Tricks for Image Classification with Convolutional Neural Networks》
-
CVPR2019
- 整理了一些CNN文章中的Refinement(从开源代码中提取出来)并且分析
- 给ImageNet上的Res50提了4个点(75-79)
- 说明了更好的分类效果(BaseBone)能够提升迁移学习的能力
Basline Implemention(常规操作)
- 预处理与数据增强
- 随机Crop并且转化为[0,255]之间的32位宽浮点数
- 随机Crop的aspect ratio在3/4到4/3
- 大小从8~100%
- 50%概率水平翻转
- 最后被Resize到[224,224]
- 加上PCA Noise
- 对饱和度,亮度等等取[0.6,1.4]之间的正态Sample
- 最后Normalize整个图片
- (对测试的时候,我们不做增强,首先对图片按照短边resize到256,再随机Crop到244,然后Normalize)
- 采用Xavier初始化
- 使用加Nesterov加速的SGD(NAG)
- batch-size: 256
- 共训练120 epoch
- lr 0.1(30,60,90 epoch上x0.1)
Efficient Training - 提升速度
- 用更大的Batch更快,但是会有问题
- 凸优化问题的本质决定的,更大的Batch-Covergence Rate更小…
- 也就是为什么会一开始用Mini-Batch!
- 有一些研究尝试解决这个问题
- 有人认为可以Linear-Scaling Lr with BatchSize
- 256对应着0.1
按照我自己测试的结果大BatchSize这样一样会炸裂
- LR-WarmUp
- 一开始从0线性变大到初始lr
- 让ResBlock中BN中wx+b的参数w,一开始为0(??)
- 取消bias decay
- weight decay相当于L2 Norm
- 有些方法把weigh和bias同时给decay了
- 还有对不同layer取不一样的Learning rate的
- 能够适应很大的batch size
- lzzscl…
- 有人认为可以Linear-Scaling Lr with BatchSize
- Low-Bit Training会更快 - 主要是用fp16
- 其实主要还是GPU运算的速度快了,效率按照完全看来其实比不上fp32
- 基本没有Accuracy的损失
- Network Tweak - 对结构进行微调
- ResNet结构分析
- 1个输入Stem,4个中间环节,一个output layer
- Input Stem: 7x7 Conv (Stride 2) + 3x3 MaxPool (Stride 2)
- Width 64 InputDownSample x4
- Stage (首先一个DownSample,接着几个ResBlock)
- DownSample Block (双路)
- ResBlock
- 个数不同,导致ResXXX
- DownSample Block (双路)
- Input Stem: 7x7 Conv (Stride 2) + 3x3 MaxPool (Stride 2)
- ResNet结构分析
Training Refinement - 提升精度
- Cosine Learning Rate Anealing
- 比较原先的LR的Step Decay,选用了Cosine方式的Decay
- Label Smoothing
- 传统的直接拟合one-hot label,直接计算Softmax的方法
- 可以被理解为:Encourage一个非常Distinctive的模型从而lead To Overfitting!
- Solution: 咱把Onehot的Label给改了吧
- 传统的直接拟合one-hot label,直接计算Softmax的方法
- KD
我就知道有你
- MixUp Training
- 也可认为是一种数据增强