Bag of Tricks for Image Classification with Convolutional Neural Networks

论文:http://xxx.itp.ac.cn/abs/1812.01187
代码:https://github.com/dmlc/gluon-cv

0 摘要

近期,图像分类领域的改善主要是训练过程的改进,包括对数据增强及优化算法的改进。但是很多论文里并没有详细介绍改进细节,或者干脆只有在源代码中才可以看到具体的改进细节。本文,作者通过分类准确率验证了这些改进的有效性。实验结果表明,通过组合使用这些改进措施,可以有效地提升cnn分类的准确性。比如可以把ResNet50在ImageNet数据集上的top-1准确率从75.3%提升到79.29%,作者还证实了这些改进措施也可以迁移到目标检测和分割领域改进效果。

1 简介

CNN近几年持续的改进图像分类效果不仅仅来自于网络结构的进步,图像预处理和优化算法的进步也起到了至关重要的作用。但是很多论文中对这些处理措施的具体描述却很少。本文作者验证了一系列的“trick”,实验结果也证明了这些trick对提升准确率有很大的帮助。

在这里插入图片描述

2 训练过程

在这里插入图片描述

2.1 基础训练过程

作者使用ResNet作为骨干网络,对训练集和测试集使用不同的预处理。

对训练集:

  1. 随机采样一张图像,读取图像,变换其为浮点型数据,像素值范围[0,255];
  2. 从图像上随机裁剪一个矩形区域,长宽比为[3/4,4/3],矩形框所占的图像面积为原图像的[8%,100%],将裁剪的子块缩放到 224 * 224;
  3. 以50%的概率对图像进行水平翻转;
  4. 对图像的色度、饱和度和亮度进行随机变换,变换系数采样自[0.6,1.4]的均匀分布;
  5. 从N(0,0.1)的正态分布随机采样系数添加PCA噪声;
  6. 对图像进行归一化,RGB三个通道的均值为[123.68,116.779,103.939]、方差为[58.393,57.12,57.375]。

对验证集:
保持长宽比的情况下,缩放图像的短边长度为256,从图像的中间裁剪224 *224的子块,并进行归一化操作。除此之外,没有其他的数据增强措施。

所有卷积层和全连接层的参数都使用xavier算法进行初始化,也就是从[-a,a]的均匀分布中随机采样, a = d i n + d o u t a = \sqrt{d_{in}+d_{out}} a=din+dout d i n d_{in} din d o u t d_{out} dout分别是每一层输入和输出的通道数量。所有的偏置项全部设置为0。对BN层,所有的 γ \gamma γ值初始化为1, β \beta β值初始化为0.

使用NAG优化算法,每个模型都是在8块nvidia v100 gpu上训练120个epoch,batchsize 为256.初始学习率为0.1,在第30,60,90个epoch时学习率减小为原来的1/10.

2.2 实验结果

作者在三个网络上进行了验证,分别是ResNet-50、Inception-V3和MobileNet,InceptionV3的输入图像需要缩放到299 * 299。使用ILSVRC2012数据集,包含1000类共130万张图像。验证准确率如下表。
在这里插入图片描述从表中可以看出,作者训练的ResNet-50模型的分类效果比参考论文的效果略好,另外两个略差,作者认为这是因为训练过程不一致造成的。

3 高效训练

近年来,硬件特别是GPU发展很快。相应地,为了取得更好效果的trade-off措施也有所改变,例如,使用低精度和更大的batchsize可以加速训练过程。本节介绍如何在不牺牲精度的情况下使用低精度和更大的batchsize进行训练。某些方法可以同时改善训练效率和准确率。

3.1 大batch训练

对于凸优化问题,mini-batch大了之后,同一个数据集一个epoch需要迭代的次数在减小,因此收敛速率会降低。也就是说,训练同样数量的epoch时,使用大的batchsize训练的模型的准确率反倒不如使用小的batchsize训练的模型的准确率。

下面作者验证了四种有助于提升batchsize大小的处理措施:

对初始学习率进行线性变换:
mini-batch SGD中,梯度下降是一个随机过程,因为batch中的图像是随机挑选的。增大batchsize不会改变随机梯度的均值,但会减小随机梯度的方差。也就是说,增大batchsize会减小梯度的噪声,所以我们可以使用更大的学习率来加速收敛。

这里作者对初始学习率进行了线性变换,如ResNet所示,初始学习率为0.1,batchsize为256,那么如果这里使用的batchsize值b大于256,那么初始学习率应该线性增加到 0.1 × b / 256 0.1 \times b/256 0.1×b/256

学习率warm up
训练初始阶段,所有的参数都是随机初始化的,很最终的参数相差甚远。如果在初始阶段使用太大的学习率,容易造成数值不稳定。作者这里使用了学习率warmup的策略,也就是在训练初始阶段使用一个较小的学习率,等到几个epoch之后训练稳定之后才开始使用初始学习率。作者这里使用渐进增大学习率的策略,即假设使用前m个batch(例如,5个epoch)进行warmup,初始学习率为 η \eta η,那么对于batch i, 1 ≤ i ≤ m 1 \leq i \leq m 1im,设置学习率为 i η / m i \eta / m iη/m

这里引用知乎https://www.zhihu.com/question/338066667/answer/771252708香侬科技的回答:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
zero γ \gamma γ
ResNet网络中把喊了多个残差块,每一个残差块又包含了多个卷积层。给定输入x,假设block(x)为残差块最后一层的输出。那么残差块最后的输出为block(x)+x。残差块的最后一层有可能是BN层。BN层首先对输入x进行归一化,得到 x ^ \hat{x} x^,然后进行一个线性变换 γ x ^ + β \gamma \hat{x} + \beta γx^+β γ \gamma γ β \beta β都是通过训练得到的参数,初始化值分别为1和0.

本节的zero γ \gamma γ策略就是说,对所有残差块的最后一个BN层的参数 γ \gamma γ都初始化为0,那么每一个残差块的最终输出就是输入,这样就相当于在训练的初始阶段网络层数更少,易于训练

bias不进行权重衰减
权重衰减一般要应用于模型的全部可训练参数,包括权重和bias。这相当于对所有的参数应用L2正则化,迫使所有的参数接近于0。但是,有的论文提出只对卷积层和fc层的weights进行正则化以避免过拟合,所有的bias项和BN层中的 γ \gamma γ β \beta β项无需进行正则化处理

3.2 低精度训练

神经网络一般都是以float32(FP32)的精度进行训练,这也就是说所有的输入、输出和计算过程都使用fp32.但是新的硬件设备,如前面提到的nvidia v100,对fp32的计算能力是14TFLOPS,但是对fp16的计算能力是100 TFLOPS。如下面所示,将训练过程的精度从fp32变为fp16,可以将训练速度加速2到3倍。
在这里插入图片描述使用低精度进行训练,由于数值的取值范围减小,容易发生数值溢出干扰训练过程。针对这个缺点,有的论文提出使用fp16存储所有的参数和激活值,并且使用fp16计算梯度。但是,所有的参数都有一份fp32版本的副本用于进行参数更新。另外,对损失值乘一个系数可以更好地将梯度范围对应到fp16上。

3.3 实验结果

如table3所示,相比于batchsize=256的Resnet-50 fp32模型,batchsize为1024的fp16模型的每个epoch的训练时间从13.3分钟降低到了4.4分钟。但是,通过使用上面介绍的那些措施,batchsize为1024的fp16模型反倒比baseline网络高。
在这里插入图片描述表4是消融实验的结果。可以看出,将batchsize从256提高到1024,虽然使用了线性缩放,但top-1准确率仍然降低了0.7。但是,后面的LR warmup、Zero γ \gamma γ都起到了正向的效果,但 N o b i a s d e c a y No bias decay Nobiasdecay的效果却是负面的。并且使用fp16在加速训练的同时并未降低训练精度。

4 模型微调整

模型微调整是指对网络结构进行小范围的修改,如修改特定卷积层的stride值。这些小的调整一般不会改变模型的计算复杂度,但是却对分类精度有着不可忽视的作用。本节使用ResNet模型为例调研不同微调整方法的作用。

4.1 原始的ResNet结构

在这里插入图片描述Residual block和downsampling block很相似,除了所有卷积的stride都为1之外。通过变换每一个stage中residual block的数量可以获得不同深度的模型,如resnet-50或resnet-152.

4.2 ResNet微调整

在这里插入图片描述
ResNet-B
第一种修改如图2(a)所示,这是因为原来的resnet中的downsampling层第一个卷积核大小为1 * 1,但stride却为2,这就相当于忽略了3/4的输入数据。因此,修改为图2(a)所示的方案,这样就不会忽略输入数据。因为第二个3 * 3卷积的stride为2,这样并不会改变输出的尺寸。

ResNet-C
第二种修改如图2(b)所示,是对原始resnet的input stem进行修改,将原来的7 * 7 卷积修改成三个连续的3 * 3卷积,这样可以减少计算量。三个连续的 3 * 3卷积中,前两个的输出channel数为32,最后一个的输出channel数为64。

ResNet-D
如图2(D)所示,作者受ResNet-B的启发,发现downsampling模块中的path B也是使用了stride为2的1 * 1卷积,这样也相当于忽略了3/4的输入数据。所以作者将path B修改为先进行stride为2的kernel也为2的平均池化,然后再进行1*1卷积操作,这样不会忽略输入数据,但是实验发现却又有很好的识别结果。

4.3 实验结果

在这里插入图片描述ResNetC是在ResNet-B基础上进行修改,ResNet-D是在ResNet-C的基础上进行修改,结果显示ResNet-D的效果最好,但计算量也比ResNet增加了15%,但作者实测速度仅慢了3%。

5 训练细节修改

5.1 Cosine学习率衰减

常用的学习率衰减方法包括指数衰减和step衰减。这里作者使用别的论文提出的学习率衰减:
η t = 1 2 ( 1 + cos ⁡ ( t π T ) ) η \eta_t = \frac{1}{2}(1+\cos(\frac{t \pi}{T}))\eta ηt=21(1+cos(Ttπ))η
η \eta η表示初始学习率,T表示忽略掉warmup之后的总的训练epoch数目。

在这里插入图片描述
上图(a)是step和cosine衰减的对比图,从图中可以看出,cosine衰减在初始阶段衰减很小,中间部分额衰减却接近于线性,末期衰减速率又会变小。在衰减中间过程中,cosine衰减的学习率要大于step衰减,因此可以加速模型的训练过程。但从图(b)却发现,虽然两种衰减方式得到的最终准确率基本一致,但step衰减却比cosine衰减更快的取得了更高的准确率。很明显Step Decay在衰减之后,准确率就上来了,说明衰减之前的数量级效用已经不强了,这个时候Cos decay还是那个数量级,所以速度就比Step Decay慢了。显然Step Decay方法60-80个Epoch就达到的水准,要Cos Decay120个Epoch去达到,说服力不强。但cosine衰减的确是提供了一个新的衰减思路。

5.2 label smoothing

label smooth有助于提升模型的泛化能力。

推导过程
softmax函数:

在这里插入图片描述

交叉熵loss:
Loss = − ∑ i = 1 K p i log ⁡ q i \text{Loss} = -\sum_{i=1}^Kp_i\log q_i Loss=i=1Kpilogqi
其中 p i = { 1 ,    i = y 0 ,    i ≠ y p_i = \begin{cases} 1,~~ i=y \\ 0,~~i \neq y \end{cases} pi={1,  i=y0,  i=y
y表示当前样本的真实类别。

按照上面的损失函数进行最小化,得到的最优解为:
z i = { + ∞ ,    i = y 0 ,         i ≠ y z_i = \begin{cases} +\infty, ~~ i=y \\ 0,~~~~~~~i \neq y\end{cases} zi={+,  i=y0,       i=y
也就是说,会鼓励学得的网络对自己的分类结果特别的自信,正确类别和错误类别之间的差距非常大。

但训练集的标注过程中,人为标注难免有一定的误差,模型过于相信标注的label会带来一定的过拟合的风险。并且在训练样本数据量不足时,训练样本不足以代码全部样本的全体特性,只是对于训练样本进行特别针对性的学习也容易造成过拟合。

label smoothing的思想就是对正确的类别的label不要太过确性,对错误类别的label也不要直接设置为0,也就是使用了soft one-hot添加了一定量的噪声。建议按照下面的方式进行标注:
在这里插入图片描述
ε \varepsilon ε是一个小的常数。此时最优解会变成:
在这里插入图片描述
其中, α \alpha α是任意的实数。 ε \varepsilon ε=0时,等价于原始softmax。但随着 ε \varepsilon ε的增加,差距会减小。特别是 ε = K − 1 K \varepsilon = \frac{K-1}{K} ε=KK1时,各z的取值会相等。图4(a)给出了 ε \varepsilon ε变化时gap值得变化情况。gap值是指fc层的输出中正确类别的logits值和其余类别logits输出均值之间的差值。

作者比较了使用ResNet50-D模型在使用和不使用label smoothing时gap值的变化情况。 ε \varepsilon ε=0.1, α \alpha α=10时,理论gap值为9.1。图4(b)给出了两种情况下在Imagenet验证集上gap值的分布范围,可以看出使用了smooth labeling之后的模型的gap值更加靠近理论上的gap值且离群点更少。

在这里插入图片描述
pytorch实现:https://www.jianshu.com/p/b9684ced5e33

5.3 知识蒸馏

知识蒸馏是指用teacher model辅助当前student模型的训练。teacher model一般是一个具有更高准确率的预训练模型。提供对teacher model的模仿,student model可以在保持计算量的情况下提升自身的准确率。这里使用resnet-152做teacher model帮助训练resnet-50模型。

在训练过程中,作者在原始交叉熵损失的基础上添加了一项蒸馏损失,蒸馏损失用于惩罚teacher model的预测和student model的预测之间的差异。给定输入,假设真实输出概率分布为p,z和r分别是student model和teacher model的最后一个全连接层的输出。注意前面我们使用交叉熵损失 l ( p , s o f t m a x ( z ) ) l(p,softmax(z)) l(p,softmax(z))表示p和z之间的差异,所以对于蒸馏损失也可以使用交叉熵损失。因此,总的损失是:
在这里插入图片描述
T是超参数,叫做蒸馏温度值,用于控制softmax的输出更加smooth。

5.4 混合训练

混合训练,是指在数据增广过程中,任意挑选一对样本 ( x i , y i ) (x_i,y_i) (xi,yi) ( x j , y j ) (x_j,y_j) (xj,yj),通过对两者进行线性加权得到一个新的样本。

在这里插入图片描述
λ ∈ [ 0 , 1 ] \lambda \in [0,1] λ[0,1]随机采样自 B e t a ( α , α ) Beta(\alpha,\alpha) Beta(α,α)

混合训练时,作者只使用新生成的样本 ( x ^ , y ^ ) (\hat x,\hat y) (x^,y^)

5.5 实验结果

设置label smooth参数 ε \varepsilon ε=0.1;设置蒸馏参数T=20,teacher model选取一个具有cosine decay和label smoothing 的ResNet-152-D模型;混合训练时,设置参数 α = 0.2 \alpha = 0.2 α=0.2,扩大训练epoch从120到200,因为混合训练往往需要更多的迭代次数才能更好的收敛。

在这里插入图片描述上面的实验结果显示了,这些训练trick对不同类型的模型都具有正向的效果。但是蒸馏对Inception V3和MobileNet没有取得正向的效果,作者认为这是因为teancher model(Resnet-152-D)和student model(Inception V3和MobileNet)不属于相同的模型族造成的,更换合适的teacher model应该也可以取得正向的效果。

在这里插入图片描述更换数据集进行训练同样证明了这些trick的有效性。

6 迁移学习

使用这些trick训练的分类模型迁移到检测任务上的效果
在这里插入图片描述可以看出,使用的分类模型的准确率越高,检测的mAP越高。

使用这些trick训练的分类模型迁移到语义分割任务上的效果
在这里插入图片描述在语义分割任务上,却是cosine衰减的提升最大,其余trick的提升要相对小一些。作者认为这是因为语义分割是像素级的任务,而label smoothing、蒸馏和混合训练,都会模糊原始的像素级信息,因此会造成像素级任务的准确率下降。

参考:
https://blog.csdn.net/u010712012/article/details/93767709

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值