Bag of Tricks for Image Classification with Convolutional Neural Networks

 

摘要:

图像分类任务当前取得的很多进展都可以归功于训练程序的优化,例如数据扩展与优化的方法。在文献中,大多数改进要不是作为实现细节简单提到,就是仅仅在源码中展现。本文中,我们会验证一系列这样的改进,并且利用切除实验的思想在实验中验证这些改进的效果。实验结果显示,通过将这些改进组合在一起可以显著的提升一些CNN模型的表现。例如,我们将RestNet50在ImageNet上的top1准确率从75.3%提升到79.2%。结果还显示出,在图像分类上准确率的优化使得在例如目标检测、分割等其他领域的应用上迁移学习的效果更好。

1、Introduction

自从2012年出现了AlexNet,图像分类的主要方法就被深度神经网络主宰了。从那时起,许多新的网络结构提了出来,包括VGG,NiN,Inception,ResNet,DenseNet,NASNet等。与此同时我们看到了模型进度持续进步的趋势。例如,ImageNet上top-1的准确率从AlexNet的62.5%上升到NASNet-A的82.7%。

但是这些进步并不单单来自模型结构的改进。训练流程的改进,包括loss函数,数据处理流程,优化方式的改进也起到了关键作用。过去这些年提出了大量的类似优化方法,但是得到的关注相对较少。在文献中,大多是仅仅作为实现细节简单带过,有些甚至只能在源码里找到。

本文中我们会实验一系列训练流程与模型结构的优化来提升模型的准确率,并基本不改变模型的计算复杂度。它们很多是不起眼的tricks例如修改特定卷积层的stridesize,修正学习率的调整计划等。然而整体来看它们创造了很大的不同。我们会在不同数据集与网络结构上评估这些tricks,并且得到它们对最终模型准确率的影响。

我们的实现显示一些tricks对准确率的提升起到了很大的作用,将他们级联在一起使用可以更好的提升模型的进度。我们在使用这些tricks到ResNet50后,与表1中的其他相关网络进行了对比。可以看到这些tricks将ResNet50在ImageNet上的top-1准确率从75.3%提升到79.29%。这些tricks还提升了其他更新的并且已经改进了的网络结构的下过,例如SE-ResNeXt-50。此外,我们还展示了我们的方法可以推广到其他例如Incptionv3,Mobilenet网络与其它数据集例如Place365。此外实现还展示出利用我们tricks训练出的模型在其他例如目标检测或者语义分割上的迁移学习表现更好。

论文大纲:

我们首先在第二章设定标准训练流程,然后在第三章讨论一些在新硬件上有效训练的tricks。在第四章,我们回顾三种对ResNet主要模型结构常用的微调方法,并提出一种新方法。在第五章会讨论其他四种训练流程优化方法。最后,在第六张我们会研究这些更加精确的模型会不会在迁移学习是有用。

我们模型实现与训练脚本在GluonCV上开源了。

2、训练流程

使用小批量随机梯度下降法训练神经网络的模板如Algorithm1所示。在每一次迭代中,我们随机选择b图片来计算梯度,之后更新网络权重。训练当K跑完整个数据集后停止。Algorithm1中所有的功能与超参数都可以有多种不同的方式实现。本章中,我们指定一个Algorithm1的baseline实现。

2.1 baseline训练流程

我们将广泛使用的RetNet50的实现作为我们的baseline。训练与验证阶段的处理流程是不同的。在训练阶段,我们一步一步执行以下步骤:

  1. 随机采样样本,将图片转成值在[0,255]间的32位浮点数。
  2. 随机crop矩形区域,长宽比在[3/4,4/3]范围内随机,面积随机在[8%,100%]间随机,将crop出的区域resize到224*224尺寸。
  3. 使用0.5的概率对样本进行水平翻转。
  4. 色度、饱和度、亮度统一置为[0.6,1.4]。
  5. 增加参数从服从分布中采样的PCA噪声。
  6. 通过RGB通道分别减去123.68,116.779,103.939,除以58.393, 57.12,57.375进行正则化。

在验证阶段,我们将每张样本的短边resize成256大小,并保持长宽比。下一步以中间为中点,crop出一个224*224的区域,并使用相同的方法对RGB通道进行正则化。在验证阶段我们不进行任何随机数据扩展。

卷积层与全连接层的参数都使用Xavier算法进行初始化。特别的是,我们将参数统一设置为[-a,a]之间的值,这里分别表示输入与输出的通道大小。所有的biases都初始化为0。对于BN层,向量初始化为1,向量为0。

NAG(Nesterov Accelerated Gradient)下降法【20】用来进行训练。每个模型都在8块V100显卡的服务器上以batchsize256训练120个epochs。初始化学习率为0.1,分别在第10、30、60、90epoch时除以10。

2.2 实验结果

我们评估了三个CNNs:ResNet50【9】,Inception-V3【1】,MobileNet【11】。对于Inception-V3我们将输入样本resize到299*299。我们使用ISLVRC2012【23】数据集,包含100类,130万样本。验证准确率如表2所示。明显看的出来,ResNet-50结果比对比结果要好,baseline的Inception-V3与MobileNet由于不同的训练流程准确率略低。

3、高效训练

硬件,特别是GPU这些年快速进化。因此,许多效果相关的trade-offs优化选项都有了变化。例如,现在训练时使用更低精度与更大的batchsize会更有效。本章中,我们回顾多种能够低精度与大batchsize训练,而不影响模型准确率的技术。有些甚至可以同时改进准确率与训练速度。

3.1 Large-batch training

Mini-batch SGD通过将多张样本组成一个组来增加并发,降低通信损失。然而使用大的batchsize有可能拖慢训练进程。还有收敛问题,随着batchsize的增加,收敛率会降低。类似的实验结果在文献【25】中有提到。换句话说,对于一样数量的epochs,大batchsize训练出来的模型相比小batchsize模型验证集的准确率会下降。

许多工作【7,14】都提出了解决这个问题的思路。在接下来的段落中,我们会对4种提升batchsize大小进行单机训练的思路进行仿真实验。

线性变化的学习率(Linear scaling learning rate)。在mini-batch SGD中,梯度下降是一个随机的过程,因为每个batch中的样本是随机选择的。增加batchsize并不会改变随机梯度的期望,但是会降低它的变化。换句话说,大batchsize降低了梯度噪声,所以我们可以通过增加学习率来使得梯度下降朝正确的方向取得较大的进展。文献【7】中实验结果显示,根据batchsize线性增加学习率对ResNet-50训练是有提升的。也就是说,如果我们依据文献【9】将初始化学习率选为0.1,batchsize为256,当我们将batchsize改为更大的b是,我们会将初始化学习率修改为

Learning rate warmup。在训练的初始阶段,所有的参数基本都是随机值,离最终的结果差很远。使用过大的学习率容易导致数据的不稳定性。在热身阶段,我们使用小的学习率,当训练过程稳定下来后再切换到初始化学习率【9】。文献【7】提出了一种逐步的warmup侧来,线性的将学习率从0增加到初始化学习率。换句话说,假设我们用钱m个batchs(例如5个epochs)来进行warmup,假设初始化学习率为,在第i个batch,,我们会将学习率设置为

Zero。ResNet是由多个残差模块组成的,每个模块都包含数个卷积层。假设输入为x,假设block(x)是模块最后一层的输出,那么这个残差模块的输出是x+block(x)。注意到,一个模块的最后一层可以是BN层。BN层会标准化它的输入,表示为,然后进行尺度的转换。γ与β都是被初始化为0或者1的可以训练的参数。在zero γ初始化情况下,我们将所有在残差模块最后的BN层初始化为γ=0。因此,所有残差模块仅仅是返回他们的输入,这样网络会有更少的层,并且在初始化阶段更容易收敛。

No bias decay。权重衰减通常会应用到包括权重与偏差的所有学习参数上。它相当于对于所有参数应用L2约束来使得所有参数趋向于0。就像文献【14】中指出的那样,然而,更加推荐将它应用到约束权重上来避免过拟合。无偏差衰减方式遵循了这样的建议,它仅在卷积与全连接层应用权重衰减。其他参数,包括BN层的biases,γ与β不会进行正则化。

注意文献【4】的LARS提供了了一种分层自适应学习率的方式,并且文中说明对极大的batchsize(大于16K)时会有效果。本文中我们将研究范围限制在可以单机训练的方法中,这种限制下一般batchsize不大于2K时可以得到更好的系统效果。

3.2 低精度训练(Low-precision training)

神经网络通常是在32为浮点数(fp32)精度下训练出来的。这意味着所有的数据都以FP32的格式存储,所有算法操作的输入与输出也都是FP32。然而新的硬件可能会有低精度数据支撑的算法处理模块。例如,之前提到的英伟达V100提供了14TFLOPS的FP32计算能力,但FP16的计算能力高达100TFLOPS。如表3所示,V100上将FP32换成FP16后整体的训练时间提速了2到3倍。

除了性能提升外,低精度的数字范围较窄,使得结果很容易就越界了,这样干扰了训练的进程。文献【19】提出了将用FP16存储所有参数与激活函数,使用FP16来计算梯度。同事,所有参数有一个FP32的备份,用于参数更新。此外,将loss乘以一个缩放变量,使得梯度范围在FP16之内也是一种有效的解决方式。

3.3 实验结果

ResNet50的评估结果在表3中展示。与batchsize256进度FP32的baseline相比,使用更大的1024batchsize与FP16将ResNet50的训练时间从13.3min每个epoch降到4.4min每个epoch。此外,通过累积所有large-batch训练思路,1024batchsize与FP16训练出来的模型甚至比之前baseline模型的Top-1准确率略微高了0.5%。

所有方法的切除实验结果如表4所示。在将batchsize从256增加到1024过程中使用线性尺度变化学习率的方法top-1准确率下降0.9%,当将剩下的三种方法用上时可以填上这段差距。在训练结束时将训练方法从FP32转换成FP16不会影响准确率。

4 模型微调(Model Tweaks)

模型的微调是调整网络结构的窗口,例如修改一个特征卷积层的stride。这样一个微调可能对整体的计算复杂度影响不大却对模型的进度产生很大的作用。本节中,我们用ResNet作为例子来探究模型微调的影响。

4.1 ResNet结构

我们会简要介绍ResNet的结构,特别是与模型微笑相关的那些模块。详细信息请参考文献【9】。ResNet网络结构包括输入,四个子序列阶段与一个最终输出层,如图1所示。输入层有一个7×7的卷积,输出channel为64,stride为2;一个3×3的maxpooling层,stride为2。输入层将输入的宽高减少了4倍,将channel个数增加到64。从stage2开始,每个stage第一个模块都是降采样模块,紧跟着数个残差模块。在降采样模块中,有pathA与pathB两条路径。PathA有三个卷积层,kernelsize分别为1×1,3×3,1×1。第一个stride为2的卷积层将输入宽与高减半,最后一个卷积层的输出通道数是4倍大于之前的2,我们成为瓶颈结构。PathB使用stride为2的1×1卷积,将输入尺寸转换为pathA输出尺寸,这样我们将两种路径的结果相加得到下采样模块的输出。残差模块除了只用stride为1的卷积层外,与降采样模块十分相似。

我们可以通过修改每个阶段残差模块的个数来获得不同的ResNet模型,例如RetNet50与RetNet152,这里数字表示网络中卷积层的个数。

4.2 网络微调(ResNet Tweaks)

接下来我们重现两个流行的ResNet微调,分别称为ResNet-B与ResNet-C。随后我们提出了一个新的微调模型ResNet-D。

ResNet-B。这种微调最早出现在ResNet【8】Torch版实现中,随后被多出引用【7,12,27】。它修改了ResNet的下采样模块。可以观察到PathA使用kernelsize为1×1,stride为2的参数减少了输入特征图的四分之三。ResNet-B将pathA前两个卷积的stridesize进行了交换,如图2所示,这样就没有信息损失了。由于第二个卷积kernelsize为3×3,pathA的输出尺寸不会改变。

ResNet-C。这个微调方式在Inception-v2【26】最初提出来,也可以在其他模型的实现中找到,例如SENet【12】、PSPNet【31】、DeepLabV3【1】与ShuffleNetV2【21】。可以观察到卷积的计算消耗是长宽的二次方。7×7的卷积比3×3的卷积计算量大5.4倍。所以这里的微调是将输出层的7×7的卷积替换为三个传统的3×3卷积,如图2b中所示,前两个卷积输出channel为32,stride为2,随后一个卷积输出为64channel。

ResNet-D。受到ResNet-B启发,我们注意到下采样模块中的pathB中1×1卷积同样也忽略了四分之三的输入特征图,我们会对他进行修改这样就不会有信息丢失了。在实验中,我们发现在stride为1的卷积前面新增一个2×2的average pooling层,stride为2实际中效果不错而且对计算量的影响不大。这个微调在图2c中展示。

4.3 实验结果

我们评估第三节中提到的微调与设置在ResNet50上的效果,也就是说batchsize大小为1024,精度为FP16。结果如表5所示。

从结果看,ResNetB在pathA的下采样模块中接收到了更多的信息,与ResNet50相比验证准确率提升了0.5%。将7×7的卷积替代为3个3×3的卷积共享了0.2%的提升。在pathB 中降采样模块得到更多的信息将验证准确率提升了额外的0.3%。整体来说,ResNet50-D比ResNet50提升了1%的准确率。

此外,这四个模型的大小相同。ResNet-D的计算量最大,但是与ResNet-50相比相差不超过15%的浮点操作。实际观察中,ResNet-50-D在训练过程仅仅比ResNet-50慢了3%。

5、训练优化(Training Refinements)

本节中,我们会讨论4中训练优化的方式来进一步优化模型的准确率。

5.1 Cosine Learning Rate Decay

学习率的调整对于模型训练来说非常重要。在3.1中提到的初始阶段学习率warmup后,我们通常相对稳定的从初始学习率开始将学习率逐步降低。广泛应用的方式是以指数的方式降低学习率。文献【9】中每30epochs将学习率降低0.1,我们将其称为逐步下降。文献【26】中每两个epochs将学习率降低0.94倍。

与之不同,文献【18】提出了一种cosine退火策略。简单来说是利用cosine函数将学习率从初始学习率降到0。假设batches的个数为T(不包括warmup阶段),那么在第t个batch的时候,学习率计算如下式:

这里是初始化学习率。我们将这种设计成为cosine下降。

逐步下降与cosine下降的对比如图3a所示。可以看出cosine下降在初始阶段学习率下降较为缓慢,在中间阶段几乎是线性变化,在尾端有变成缓慢变化。与逐步下降相比,cosine下降在开始阶段就开始学习率衰减,但是在step下降将学习率降低了0.1之后还保持比较大的值,这样潜在的改进了训练的进程。

5.2 Label Smoothing

图像分类网络的最后一层通常是一个大小等于标签数的全连接层,表示为K,输出预测的得分。给定一张样本,用来表示第i类的得分。这些得分通常会被softmax进行正则化从而获得预测的概率。Softmax的输出表示为q,那么,第i类的概率可以计算如下:

很容易可以看出来,,并且,所以q是一个有效的概率分布。

换个角度,假设这个样本真实的标签是y,我们可以构建一个真实的概率分布为。在训练阶段,我们通过cross entropy loss来最小化负样本来更新模型参数使得这两个分布相似。

特别的是,通过p构造的方式,我们知道。优化策略是inf,并且保持其他值足够的小。换句话说,这样会鼓励输出分数朝着同样的分布变化,这会潜在导致过拟合。

Label smoothing最早是在文献【26】训练Inception-v2模型提出来的。他将真实的概率构成改变成

这里是一个小常量。这样优化的方案变成了

这里α可以是一个任意实数。这样使得全卷积层的输出是一个有限的实数,可以有更好的泛化性。

是,会是,当增加是,差值减小。特别是当时,所有期望的都会是完全相同的。图4a展示了随着值得变化,差值的变化趋势,假设对于ImageNet数据集K=1000。

我们通过实验对比了分别用与不用label smoothing训练出来的ResNet-50-D模型,计算了虽大预测值与平均预测值的差值。当,理论的差值差不多是9.1。图4b展示了再ImageNet验证集上两个模型预测值的差别。明显可以看出来,使用label smoothing后,分布会集中在理论值周边,并极值更少。

5.3 知识蒸馏(Knowledge Distillation)

知识蒸馏中【10】,我们用一个teacher model来帮助训练现有的模型,现有的模型被称为student model。Teacher model通常是预训练的精度较高的模型,通过Imitation,student模型可以在保持计算复杂度的情况下改进自身的精度。举个例子就是利用ResNet152作为teacher模型来帮助训练ResNet50模型。

训练过程中,我们增加一个distillation loss来惩罚teacher模型与student模型softmax的输出。作为输入,假设P是真实的分布,z与r分别是teacher与student模型最后一层全连接的输出。记得之前我们使用negative cross entropy loss来度量p与z的区别,这里我们使用同样的loss来进行蒸馏。因此,loss可以改变成

这里T是临时的超参数来使得softmax的输出更加平滑,这样蒸馏出teacher模型预测的label分布。

5.4 Mixup Training

在2.1节中,我们描述了如何在训练之前进行数据扩展。这里我们讨论另外一种数据扩展的方式成为mixup【29】。在mixup中,我们每次随机取样两个样本。然后我们将这两个个样本进行线性加权差值来得到一个新样本:

这里是从Beta(α,α)分布中随机抽取的值。在mixup训练中我们仅使用新的样本

5.5 实验结果    

现在我们评估4中训练优化方式。我们根据文献【26】设置进行label smoothing。模型蒸馏我们使用T=20,指定使用cosine学习率下降与label smoothing训练出来ResNet-152-D预训练模型作为teacher模型。在mixup训练时,我们选择α=0.2的Beta分布。由于mixed样本需要更长的训练时间来更好的收敛,将epochs数从120增加为200。当将mixup训练与知识蒸馏一起使用时,我们训练的teacher模型效果更好。

我们展示了优化不仅仅旨在ResNet结构或者ImageNet数据集上有效。首先我们利用这些优化在ImageNet数据集上训练了ResNet-50-D,Inception-V3与mobileNet模型。每个模型的验证集准确率如表6所示。当增加了cosine衰减,label smoothing与mixup后,我们持续的改进了ResNet、InceptionV3与MobileNet模型。Distillation在ResNet上有效,却在InceptionV3与MobileNet上没有效果。我们的解释为teacher模型与student模型来自不同家族,因此预测的分布不同,给模型带来了负面的影响。

为了支撑我们tricks在其他数据集上也是有效的,我们在MIT Places365数据集上利用ResNet-50-D模型分别训练了使用与不使用优化方法的模型。结果在表7中展示。我们发现优化方法无论是在验证集还是测试集上都改进了top-5准确率。

6、迁移学习(Transfer Learning)

迁移学习是使用训练好的图像分类模型的一种重要方式之一。本节里,我们会探索是否之前讨论的改进方法对迁移学习也有效。特别的是,我们选择两个最重要的CV任务目标检测与语义分割,并使用多个不同模型来评估他们的表现。

6.1 目标检测

目标检测的目标是取得样本中目标的bounding box。我们使用PASCAL VOC【3】来评估表现。与文献【22】中相似,我们使用联合数据集VOC2007 trainval与VOC2012 trainval来进行训练,VOC2007 test来进行验证。我们在这个训练集上训练了Faster-RCNN【22】,使用了Detectron【5】中的优化方法例如线性warmup与长训练周期。VGG-19的基础模型被之前提到的多个预训练模型替换。我们保持其他设置不变,这样保证改进只会单独来自base模型。

mAP结果在表8中展示。我们可以观察到,更高验证精度的base模型总是可以带来更高的Faster-RCNN的mAP。特别指出,ImageNet上精度为79.29%的base模型带来VOC上81.33%的最好mAP,这个结果比标准模型的结果提升了4%。

6.2 语义分割

语义分割是预测输入样本每个像素的类别。我们使用文献【17】的FCN来进行验证。在ADE20K数据集上训练模型。根据PSPNet【31】与【30】,我们将base网络替换为之前章节提到的base模型,在stage-3与stage-4中使用dilation网络策略【2,28】。在base网络的顶端建立了一个全卷积decoder来进行最终的预测。

像素准确率(pixAcc)与集合平均交集(mIoU)的结果在表9中展示。与目标检测任务的结果相反,cosine学习率方式有效的改进了FCN的表现,而其他方法的结果没达到最好。对这种现象的一个潜在解释是语义分割是像素级别的预测。这样label smoothing,distillation与mixup的训练方式会弱化labels,模糊像素级别信息,这样会导致整体像素级别的准确率模糊与退化。

7、结论

本文中我们对一系列可以改进模型精度的深度神经网络训练技巧进行优化。这些tricks为优化模型结构、数据预处理、损失函数与学习率调整策略进行了小幅的修改。我们的实验结果基于ResNet-50、InceptionV3与MobileNet,展示了这些tricks可以持续稳定的改进模型的准确率。更令人振奋的是,通过将这些tricks堆集到一起可以带来准确率显著的提升。此外,这些优化过的预训练模型也展示了再迁移学习领域强大的先进性,无论是在目标检测还是语义分割领域都取得了不错的改进。我们相信这些改进也可以使得使用分类base模型的其他领域受益。

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值