[paper] Bags of Tricks for Image Classification with Convolutional Neural Networks
介绍
论文地址:https://arxiv.org/abs/1812.01187
这篇文章主要介绍了一些在训练神经网络中可以提高准确率的tricks。随着深度学习的发展,不断有新的网络结构被提出,例如VGG, NiN, Inception, Resnet, DenseNet, NASNet等。伴随着新的网络结构的诞生,分类准确率也在不断上升。但是,损失函数的改变,数据预处理和优化方法对于准确率的提升也是至关重要的,但是这些方法论文中却没有深入解释,这篇论文就是测试了不同的trick的效果,将关注点从 网络结构中移开,关注其他方面。
上图为以ResNet50为基础,在此结构进行改进所取得的结果,可以看出,Resnet50 + trick取得了很好的效果。
训练
在训练过程,我们执行一下步骤:
- 随机取一张图片,并且将其编码为32bit的float类型,其值在[0, 255]
- 随机crop一个矩形框,矩形框的长宽比在[3/4, 4/3]之间,并且要求面积在原来[8%,100%]。resize crop的区域到224*224大小。
- 50%的概率水平翻转
- 给色调,饱和度,亮度一个系数,范围[0.6, 1.4]
- 用系数加PCA噪音,系数服从正太分布N(0, 0.1)
- RGB三个通道分别减去123.68,116.779,103.939然后除以58.393,57.12,57.375
在验证阶段
- 我们resize每个图片的最短边到256pixels,并保持其原有长宽比
- 在中心crop224*224,并且像训练那样正规化RGB通道
- 在验证阶段,不用随机数据增强的方式
卷积和全连接层权重的初始化使用Xavier算法。超参数的值随机取自[-a,a],。在这里
是输入和输出的channel size。所有偏置项设为0。对于batch normalization,
向量为1,
向量为0。
训练使用Nesterov Accelerated Gradient梯度下降算法。每个模型训练120epoch使用8个Nvidia V100 gpu,batch size为256。学习率初始化为0.1,30epoch, 60epoch, 90epoch分别除以10
效果:
- 在resnet50上,效果比原网络效果好
- 在inception v3和mobilenet上比原来差些
高效的训练
大batch 训练
训练用大batch size相比训练用小batch size在验证集上表现差。
如果一定要用大的batch size,那么同时学习率也需要做对应的调整。因为在mini-batch SGD中,由于每个batch里样本的选择是随机的,因此梯度下降是个随机的过程。增加batch size不能改变随机梯度,而是会减少梯度的变化。换句话说,大batch size会减少梯度噪音,因为我们可以对应增加学习率。
举例:如果我们初始学习率为0.1,batch size为256,当我想用一个更大的batch size为b,我们需要将学习率改变到:0.1*b / 256
在训练的开始,所有参数都是随机的并且显然这些参数的值远离最终的结果。所以开始就使用一个大的学习率很可能导致大量不稳定。我们在开始时先使用一个小的学习率,在学习过程中缓慢增加学习率,当训练稳定时转到一个初始化学习率。