Bag of Tricks for Image Classification with Convolutional Neural Networks

CVPR2019 CNN Tricks

Bag of Tricks for Image Classification with Convolutional Neural Networks

原文链接:https://arxiv.org/abs/1812.01187

如题目所述,本篇文章总结了一些CNN的技巧。包括预处理、损失函数、batchsize、网络结构、标签平滑、学习率衰减等诸多问题。对CNN的tricks做了比较详细的总结,可以当做一篇综述来看。

下面根据文章的思路对这些tricks进行总结:

一、作者首先提出:为了训练过程更有效率,现在的趋势是使用大的batchsize和半精度运算(FP16)。

batchsize过大会降低训练速度(如果batchsize等于1,获得较大梯度值的概率就会大一些。batchsize大了,一平均,梯度的值往往会缩小),针对这一问题,作者总结了如下四个方法:

  1. 梯度小了,那就提高学习率。比如batchsize=256的初始学习率是0.1,新的batchsize=b,那么新的学习率就是0.1*b/256,也就是线性增长。
  2. 学习率预热(warmup)。现在大多数的训练都是开始训练的时候学习率最大。这样有一个坏处:因为随机初始化的参数离最终模型相距甚远,所以学习率较大会造成较大的不稳定性。设warmup的epoch数为n,原有的初始学习率为r,那么在前i个epoch(i大于0,小于等于n),学习率设置为i*r/n
  3. BN层的γ初始化为0。本文使用的baseline是resnet50,经过block后的数据要经过BN层。所以,γ初始化为0,那在最开始训练的时候网络的输出就与block没有关系,这相当于减少了网络的层数,方便了开始的训练。
  4. 仅对卷积层和全连接层的w做正则化衰减。偏置b和BN层的参数均不做正则化。

使用FP16进行训练,可以提升训练速度,这个很好理解。因为现在的GPU的FP16单元数一般比FP32要多几倍。同时有的FP32可以当两个FP16用。实验结果如图。
Bag of Tricks for Image Classification with Convolutional Neural Networks
PS:至于准确率为什么上升了,作者没说,还望大佬指点。

最后,根据以上tricks,结果如下:
Bag of Tricks for Image Classification with Convolutional Neural Networks
可以看出,利用以上tricks,增加了batchsize,准确率不降反升。兼顾了准确率与效率,值得应用。

二、作者对resnet50的结构进行了微调

直接上图,原始resnet50
Bag of Tricks for Image Classification with Convolutional Neural Networks
第一代改进
Bag of Tricks for Image Classification with Convolutional Neural Networks
将stride=2的减小尺寸,从1x1移后到了3x3。因为1x1的作用主要是改变维度,3x3的作用主要是提取信息。所以不希望在1x1的时候就减小了尺寸,浪费了图像信息。

第二代改进
Bag of Tricks for Image Classification with Convolutional Neural Networks
将7x7换成了三个3x3,降低了计算量和参数。同时两者的感受野相同,对网络几乎没有影响。

第三代改进
Bag of Tricks for Image Classification with Convolutional Neural Networks
同第一代改进思想类似,增加了平均池化,充分利用了图像信息。(感觉这个更像是利用了经验而做的改进)

将三个改进结合,小幅提升了计算量,提高了约1%的准确率。

三、一些tricks

1.余弦衰减学习率
Bag of Tricks for Image Classification with Convolutional Neural Networks
如下图:
Bag of Tricks for Image Classification with Convolutional Neural Networks
可以看出,这种衰减先慢后快再慢,而且比较平滑,符合训练规律,所以对准确率有小幅提升。(最开始的线性变化是上述的学习率warmup)

2.标签平滑
Bag of Tricks for Image Classification with Convolutional Neural Networks
这个是老生常谈了,目的是防止模型过拟合。公式中,q代表对标签相乘的系数,K是类别数,y是标签。ε通常取0.1。

3.蒸馏学习
这里只介绍一个作者发现的结论。同类模型进行蒸馏学习,效果较好,不同类的效果可能不理想。比如用resnet152指导resnet50训练,就容易提升性能。

4,样本融合
Bag of Tricks for Image Classification with Convolutional Neural Networks
x是样本,y是标签,λ是随机数。没说为什么,估计是想想挺有意思,做了实验发现居然有用。所以做深度学习,有时候还是需要经验主义的…

总结:一些有趣的tricks,不仅可用于图像识别,还可用于目标检测,图像分割等。至于哪些有用,哪些鸡肋,大家根据自己的课题试试才能知道吧。

欢迎讨论,欢迎吐槽。