zoukankan      html  css  js  c++  java
  • Bag of Tricks for Image Classification with Convolutional Neural Networks

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!

    http://openaccess.thecvf.com/content_CVPR_2019/papers/He_Bag_of_Tricks_for_Image_Classification_with_Convolutional_Neural_Networks_CVPR_2019_paper.pdf

    Published in CVPR 2019

    Abstract

      最近在图像分类研究方面取得的许多进展可以归功于训练过程的改进,例如数据增强和优化方法的改变。然而,在文献中,大多数改进要么作为实现细节被提及,要么仅在源代码中可见。在本文中,我们将通过消融实验来检验这些因素的集合,并实证评估它们对最终模型精度的影响。我们将展示,通过将这些要素结合在一起,我们能够显著地改进各种CNN模型。例如,我们将ResNet-50在ImageNet上的top-1验证准确率从75.3%提高到79.29%。我们还将证明,提高图像分类精度可以在其他应用领域(如对象检测和语义分割)获得更好的迁移学习性能。

    1. Introduction

      自2012年AlexNet[15]问世以来,深度卷积神经网络已经成为图像分类的主要方法。从那时起,各种新的体系结构被提出,包括VGG[24]、NiN[16]、Inception[1]、ResNet[9]、DenseNet[13]和NASNet[35]。同时,我们也看到了模型精度不断提高的趋势。例如,ImageNet[23]上的top-1验证精度从62.5%(AlexNet)提高到82.7%(NASNet-A)。

      然而,这些进步不仅仅来自于改进的模型架构。训练过程的改进,包括损失函数的变化、数据预处理和优化方法也发挥了主要作用。在过去几年中,大量这样的改进已经被提出,但受到的关注相对较少。在文献中,大多数只是作为实现细节被提及,而其他的只能在源代码中找到。

      在本文中,我们将研究一系列训练过程和模型架构的改进,这些改进可以提高模型的精度,但几乎不会改变计算复杂度。其中许多都是一些小“技巧”,比如修改特定卷积层的步长或调整学习率计划。然而,总体而言,它们有很大的不同。我们将在多个网络架构和数据集上评估它们,并汇报它们对最终模型精度的影响。

      我们的实证评估表明,几个技巧可以显著提高模型的精度,将它们结合起来可以进一步提高模型的精度。在应用所有技巧之后,我们将ResNet-50与表1中的其他相关网络进行比较。注意,这些技巧将ResNet-50在ImageNet上的top-1验证准确率从75.3%提高到79.29%。它还优于其他更新的和改进的网络体系结构,如SE-ResNeXt-50。此外,我们还证明了我们的方法可以推广到其他网络(Inception V3[1]和MobileNet[11])和数据集(Place365[33])。我们进一步证明,使用我们的技巧训练的模型在其他应用领域(如对象检测和语义分割)会带来更好的迁移学习性能。

    Paper Outline. 我们首先在第2节中建立了一个基准训练过程,然后在第3节中讨论了一些对新硬件的有效训练有用的技巧。在第4节中,我们回顾了ResNet的三个小的模型架构调整,并提出了一个新的方法。第5节讨论了四个额外的训练过程要求。最后,我们在第六节研究这些更精准的模型是否有助于迁移学习。

      我们的模型实现和训练脚本在基于MXNet[3]的GluonCV中公开提供。

    2. Training Procedures

      算法1给出了小批量随机梯度下降神经网络的训练模板。在每次迭代中,我们随机抽取b幅图像来计算梯度,然后更新网络参数。它在K次遍历数据集之后停止。算法1中的所有函数和超参数都可以通过多种不同的方式实现。在本节中,我们首先指定算法1的基准实现。

    2.1. Baseline Training Procedure

      我们遵循ResNet的一个广泛使用的实现[8]作为基准。训练和验证之间的预处理流程不同。在训练过程中,我们将逐一执行以下步骤:

    1. 随机抽取一幅图像,并将其解码为[0,255]中的32位浮点原始像素值。
    2. 随机裁剪一个矩形区域,其纵横比在[3/4,4/3]中随机采样,面积在[8%,100%]中随机采样,然后将裁剪区域调整为224×224的正方形图像。
    3. 以0.5的概率水平翻转。
    4. 使用均匀地从[0.6,1.4]中提取的系数缩放色调、饱和度和亮度。
    5. 添加PCA噪声,其中系数采样自正态分布N(0,0.1)。
    6. 分别减去123.68、116.779、103.939,再除以58.393、57.12、57.375,使RGB通道归一化。

      在验证期间,我们将每个图像的较短边调整为256像素,同时保持其纵横比。接下来,我们裁剪出中心的224×224区域,并将RGB通道归一化,这与训练类似。在验证期间,我们不执行任何随机增强。

      卷积层和全连接层的权重都用Xavier算法[6]初始化。特别是,我们将参数设置为均匀地从[-a,a]中提取的随机值,其中这里的din和dout分别是输入和输出通道的大小。所有偏差都初始化为0。对于批归一化层,γ向量初始化为1,β向量初始化为0。

      Nesterov Accelerated Gradient(NAG)下降[20]用于训练。每个模型在8个Nvidia V100 GPU上训练120个epochs,总批量大小为256。学习率初始化为0.1,在第30、60和90个epochs时除以10。

    2.2. Experiment Results

      我们评估了三个CNN:ResNet-50[9]、Inception-V3[1]和MobileNet[11]。对于Inception-V3,我们将输入图像调整为299x299。我们使用ISLVRC2012[23]数据集,其中有130万张图像用于训练和1000个类。验证精度见表2。可以看出,我们的ResNet-50结果略好于参考结果,而我们的基准Inception-V3和MobileNet由于不同的训练过程在准确性上略低。

    3. Efficient Training

      硬件,尤其是GPU,近年来发展迅速。因此,许多与性能相关的权衡的最佳选择已经改变。例如,现在在训练期间使用较低的数值精度和较大的批量更为有效。在本节中,我们将回顾各种技术,这些技术能够在不破坏模型精度的情况下实现低精度和大批量训练。有些技术甚至可以提高准确性和训练速度。

    3.1. Large batch training

      小批量SGD将多个样本分组到一个小批量中,以提高并行性并降低通信成本。然而,使用大批量可能会减慢训练进度。对于凸问题,收敛速度随着批量的增加而减小。神经网络也有类似的经验结果[25]。换言之,对于相同数量的epochs,与小批量训练相比,大批量训练导致模型的验证精度降低。

      许多文献[7,14]提出了启发式方法来解决这个问题。在下面的段落中,我们将研究四种有助于扩大单机训练批量大小的启发式方法。

    Linear scaling learning rate. 在小批量SGD中,梯度下降是一个随机过程,因为每个批次中的样本都是随机选择的。增加批量并不会改变随机梯度的期望值,但会降低其方差。换言之,大批量减少了梯度中的噪声,因此我们可以提高学习率,以便沿着梯度方向相反的方向取得更大的进展。Goyal等人[7] 研究表明,随着批量的增加,学习率呈线性增加,这对ResNet-50训练是有效的。特别是,如果我们跟随He等人[9] 选择0.1作为批大小256的初始学习率,当更改为较大的批大小b时,我们将初始学习率增加到0.1×b/256。

    Learning rate warmup. 在训练开始时,所有参数通常是随机值,因此远离最终解。使用过大的学习率可能会导致数值不稳定。在预热启发式中,我们在开始时使用一个小的学习率,然后在训练过程稳定时切换回初始学习率[9]。Goyal等人[7] 提出了一种逐步预热策略,将学习率从0线性增加到初始学习率。换言之,假设我们将使用前m批(例如5个数据epochs)进行预热,并且初始学习率为η,那么在第i批,1≤i≤m时,我们将设置学习率为iη/m。

    Zero γ. ResNet网络由多个残差块组成,每个块由多个卷积层组成。给定输入x,假设block(x)是块中最后一层的输出,然后这个残差块输出x+block(x)。注意,块的最后一层可以是批归一化(BN)层。BN层首先将其输入标准化,用xˆ表示,然后执行尺度转换γxˆ+β。γ和β都是可学习参数,其元素分别初始化为1和0。在zero γ初始化启发式中,我们对位于残差块末端的所有BN层初始化γ=0。因此,所有的残差块只返回它们的输入,模拟的网络具有较少的层数,更容易在初始阶段训练。

    No bias decay. 权重衰减通常应用于所有可学习参数,包括权重和偏差。这相当于对所有参数应用L2正则化,将它们的值推向0。然而,正如Jia等人[14] 指出的那样,我们建议仅对权重应用正则化以避免过拟合。无偏差衰减启发式算法遵循这一建议,它只对卷积层和全连接层中的权重应用权重衰减。其他参数,包括BN层中的偏差和γ、β等,都是不规则的。

      请注意,LARS[28]提供了分层自适应学习率,并且据报告对超大批量(超过16K)非常有效。在本文中,我们仅限于单台机器训练的方法,在这种情况下,批量大小不超过2K通常会导致良好的系统效率。

    3.2. Low-precision training

      神经网络通常以32位浮点(FP32)精度进行训练。也就是说,所有数字都以FP32格式存储,算术运算的输入和输出也是FP32数字。然而,新的硬件可能已经为低精度数据类型增强了算术逻辑单元。例如,前面提到的Nvidia V100在FP32中提供了14个TFLOPS,但在FP16中提供了100多个TFLOPS。如表3所示,在V100上从FP32切换到FP16后,整体训练速度加快了2到3倍。

      尽管有性能优势,但精度降低的范围更窄,使结果更可能超出范围,进而干扰训练进度。Michikevicius等人[19] 建议将所有参数和激活存储在FP16中,并使用FP16计算梯度。同时,所有参数在FP32中都有一个副本用于参数更新。此外,将标量乘以损失,以便更好地将梯度范围与FP16对齐也是一个实用的解决方案。

    3.3. Experiment Results

      ResNet-50的评价结果见表3。与批大小为256和FP32的基准相比,使用更大的批大小1024和FP16可将ResNet-50的训练时间从每个epoch 13.3分钟减少到每个epoch 4.4分钟。此外,通过对大批量训练的所有启发式算法进行叠加,使用批大小1024和FP16训练的模型比基准模型的top-1精度提高了0.5%。

      所有启发式的消融研究如表4所示。仅通过线性缩放学习率将批大小从256增加到1024会导致top-1精度下降0.9%,而其余三个启发式方法叠加则会缩小差距。在训练结束时从FP32切换到FP16不会影响准确性。

    4. Model Tweaks

      模型调整是对网络体系结构的一个小调整,例如更改特定卷积层的步幅。这种调整通常很少改变计算复杂度,但可能对模型精度有不可忽略的影响。在本节中,我们将使用ResNet作为示例来研究模型调整的效果。

    4.1. ResNet Architecture

      我们将简要介绍ResNet架构,特别是其与模型调整相关的模块。有关详细信息,请参阅He等人[9]的工作。ResNet网络由输入端、四个后续阶段和最终输出层组成,如图1所示。输入端有一个7×7卷积层,输出通道为64,步长为2,接着是一个3×3最大池化层,步长为2。输入端将输入宽度和高度减少4倍,并将其通道大小增加到64。

      从第2阶段开始,每个阶段以下采样块开始,然后是几个残差块。在下采样块中,有路径A和路径B。路径A有三个卷积,其核大小分别为1×1、3×3和1×1。第一个卷积的步长为2,将输入的宽度和高度减半,最后一个卷积的输出通道比前两个卷积的输出通道大4倍,这就是所谓的瓶颈结构。路径B使用步长为2的1×1卷积将输入形状转换为路径A的输出形状,因此我们可以将两条路径的输出求和以获得下采样块的输出。残差块与下采样块相似,只是仅使用步长为1的卷积。

      改变每个阶段中的残差块的数目可以获得不同的ResNet模型,例如ResNet-50和ResNet-152,其中该数目表示网络中的卷积层的数目。

    4.2. ResNet Tweaks

      接下来,我们回顾两个流行的ResNet变种,分别称为ResNet-B和ResNet-C。之后我们提出了一种新的模型来调整ResNet-D。

    ResNet-B. 这种调整首先出现在ResNet的Torch实现中[8],然后被多个工作采用[7,12,27]。它改变了ResNet的下采样块。我们可以观察到,路径A中的卷积忽略了输入特征图的四分之三,因为它使用的是1×1的核,步长为2。ResNet-B切换路径A中前两个卷积的步长大小,如图2a所示,因此不忽略任何信息。由于第二个卷积的核大小为3×3,因此路径A的输出形状保持不变。

    ResNet-C. 这种调整最初是在Inception-v2[26]中提出的,它可以在其他模型的实现中找到,比如SENet[12]、PSPNet[32]、DeepLabV3[1]和ShuffleNetV2[21]。观察到卷积的计算成本是核宽或核高的二次方。7×7卷积比3×3卷积贵5.4倍。因此,这一调整用三个保守的3×3卷积替换输入端中的7×7卷积,如图2b所示,第一和第二个卷积的输出通道为32,步长为2,而最后一个卷积使用的输出通道为64。

    ResNet-D. 受ResNet-B的启发,我们注意到在下采样块的路径B中的1×1卷积也忽略了3/4的输入特征图,我们希望对其进行修改,以便不忽略任何信息。实验发现,在卷积前加一个步长为2的2×2平均池化层,卷积步长变为1,这在实际应用中效果良好,且对计算成本影响不大。这个调整如图2c所示。

    4.3. Experiment Results

      我们使用第3节中描述的三个调整和设置来评估ResNet-50,即批大小为1024,精度为FP16。结果见表5。

      结果表明,与ResNet-50相比,ResNet-B在下采样块的路径A中接收到更多的信息,并将验证精度提高了约0.5%。用3个3×3卷积代替7×7卷积,提高了0.2%。在下采样块的路径B中获取更多信息可将验证精度提高0.3%。总的来说,ResNet-50-D将ResNet-50提高了1%。

      另一方面,这四个模型的大小相同。ResNet-D的计算成本最大,但就浮点操作而言,它与ResNet-50的差异在15%以内。在实际应用中,我们观察到ResNet-50-D在训练吞吐量上仅比ResNet-50慢3%。

    5. Training Refinements

      在本节中,我们将描述四个旨在进一步提高模型精度的训练要素。

    5.1. Cosine Learning Rate Decay

      学习率的调整对训练至关重要。在第3.1节所述的学习率预热之后,我们通常会从初始学习率开始稳步降低该值。广泛使用的策略是指数衰减的学习率。He等[9]每30个epochs将学习率下降至原本的0.1,我们称之为“阶跃衰减”。Szegedy等人[26]每两个epochs将学习率下降至原本的0.94。

      与之相反,Loshchilov等人[18] 提出一种余弦退火策略。一个简单的版本是通过遵循余弦函数将学习率从初始值降低到0。假设批次总数为T(忽略预热阶段),然后在批次T,学习率ηt计算为:

    其中,η是初始学习率。我们称之为“余弦”衰减。

      阶跃衰减和余弦衰减之间的比较如图3a所示。可以看出,余弦衰减在开始时缓慢降低学习速率,然后在中间几乎呈线性下降,在结束时再次减慢。与阶跃衰减相比,余弦衰减从一开始就开始衰减学习,但在阶跃衰减将学习率降低10倍之前,余弦衰减仍然很大,这有可能提高训练进度。

    5.2. Label Smoothing

      图像分类网络的最后一层通常是一个全连接层,其层大小等于标签的数量,用K表示,以输出预测的置信度得分。给定一幅图像,用zi表示第i类的预测分数。这些分数可以通过softmax算子进行归一化以获得预测概率。用q表示softmax运算符的输出q=softmax(z),第i类的概率即为qi,可通过以下公式计算:

      另一方面,假设这个图像的真实标签是y,如果i=y,我们可以构造一个真值概率分布为pi=1,否则为0。在训练过程中,我们将负交叉熵损失最小化

      标签平滑的概念首次被提出用于训练Inception-v2[26]。它改变了真实概率的结构

      其中ε是一个小常数。现在最优解变成

      其中α可以是任意实数。这鼓励了全连接层的有限输出,并且可以更好地泛化。

      通过对两个ResNet-50-D模型分别进行标签平滑和不进行标签平滑训练后的输出值进行实证比较,计算出最大预测值与其余平均值之间的差距。在ε=0.1和K=1000时,理论间隙约为9.1。图4b展示了在ImageNet验证集上预测的两个模型的间隙分布。很明显,在标签平滑的情况下,分布中心的理论值和极值较少。

    5.3. Knowledge Distillation

      在知识蒸馏[10]中,我们使用教师模型来帮助训练当前的模型,称为学生模型。教师模型往往是一个精度较高的预训练模型,通过仿真,学生模型能够在保持模型复杂性的同时提高自身的精度。一个例子是使用ResNet-152作为教师模型来帮助训练ResNet-50。

      在训练过程中,我们加入一个蒸馏损失来惩罚来自教师模型和学习者模型的softmax输出之间的差异。给定一个输入,假设p是真概率分布,z和r分别是学生模型和教师模型最后一个全连接层的输出。记住以前我们用负交叉熵损失l(p, softmax(z))来测量p和z之间的差异,这里我们用同样的损失来蒸馏。因此,损失改为

      其中T是使softmax输出更平滑的温度超参数,从而从教师的预测中提取标签分布的知识。 

    5.4. Mixup Training

      在第2.1节中,我们描述了如何在训练前增强图像。这里我们考虑另一种增强方法,称为mixup[30]。在mixup中,每次我们随机抽样两个例子(xi,yi)和(xj,yj)。然后,我们通过这两个样本的加权线性插值形成一个新样本:

    5.5. Experiment Results

      现在,我们评估四个训练要素。根据Szegedy等人[26]的研究,我们将标签平滑的ε设置为0.1。对于模型蒸馏,我们使用T=20,具体地说,教师使用了一个同时应用了余弦衰减和标签平滑的预训练ResNet-152-D模型。在mixup训练中,我们在Beta分布中选择α=0.2,并将epochs数从120增加到200,因为mixup样本要求更长的训练进度才能更好地收敛。在mixup训练与蒸馏相结合的基础上,我们对教师模型也进行了mixup训练。

      我们证明,这些改进不仅仅局限于ResNet架构或ImageNet数据集。首先,我们在包含改进的ImageNet数据集上训练ResNet-50-D、Inception-V3和MobileNet。表6显示了逐一应用这些训练改进的验证精度。通过叠加余弦衰减、标签平滑和mixup,我们稳步改进了ResNet、InceptionV3和MobileNet模型。蒸馏在ResNet上工作得很好,但是在Inception-V3和MobileNet上工作得不好。我们的解释是,教师模型不是来自同一个学生族,因此在预测中具有不同的分布,并给模型带来负面影响。此外,我们还对200个epochs进行了无mixup训练实验,结果仅在Top-1精度上增加了0.15%左右,因此mixup训练的效果仍然显著。

      为了支持我们的技巧可以迁移到其他数据集,我们在MIT Places365数据集上训练了一个ResNet-50-D模型,其中包括和不包括改进。结果见表7。我们看到,在验证和测试集上,这些改进一致地提高了top-5的准确性。

    6. Transfer Learning

      迁移学习是经过训练的图像分类模型的一个主要的下游用例。在本节中,我们将调查到目前为止讨论的这些改进是否有利于迁移学习。特别地,我们选择了两个重要的计算机视觉任务:目标检测和语义分割,并通过不同的基本模型来评估它们的性能。

    6.1. Object Detection

      目标检测的目的是定位图像中目标的边界框。我们使用PASCAL VOC[4]评估性能。类似于Ren等人[22],我们分别使用VOC 2007 trainval和VOC 2012 trainval的并集进行训练,并使用VOC 2007 test进行评估。我们在这个数据集上训练Faster-RCNN[22],并加入了Detectron[5]提出的诸如线性预热和长期训练调度等改进。在前面的讨论中,Faster-RCNN中的VGG-19基础模型被替换为各种预训练模型。我们保持其他设置不变,因此增益仅来自基础模型。

      平均精度(mAP)结果见表8。我们可以观察到,具有更高验证精度的基础模型会以一致的方式产生更高mAP的Faster-RCNN。特别是,在ImageNet上准确率为79.29%的最佳基础模型在VOC上的最佳mAP为81.33%,比标准模型高出4%。

    6.2. Semantic Segmentation

      在这一节中,我们将研究这些对基础网络的改进如何迁移到语义分割中。我们使用全卷积网络(FCN)[17]作为基准方法,并在ADE20K[34]数据集上对其进行评估。遵循PSPNet[32]和Zhang等人[31]提出的方法,我们用前面讨论过的各种预训练模型替换基础网络,并在第3和第4阶段应用扩张网络策略[2,29]。一个全卷积的解码器建立在基础网络之上,以进行最终预测。我们按照Zhang[31]中的实践选择训练超参数。

      像素精度(pixAcc)和并集中的平均交集(mIoU)都在表9中进行了汇报。与我们的目标检测结果相矛盾的是,使用余弦学习率调度训练的基础网络有效地提高了FCN的性能,而其他改进则产生了较差的结果。对这种现象的一个潜在解释是,语义分割在像素级提供了密集的预测。而经过标签平滑、蒸馏和mixup训练的模型有利于软化标签,模糊像素级信息,降低整体像素级精度。

    7. Conclusion

      本文调研了训练深度卷积神经网络以提高模型精度的十几种技巧。这些技巧会对模型架构、数据预处理、损失函数和学习率调度进行一些小的修改。我们对ResNet-50、Inception-V3和MobileNet的实证结果表明,这些技巧一致地提高了模型精度。更令人兴奋的是,将所有这些数据叠加在一起可以获得更高的精度。此外,这些改进的预训练模型在迁移学习方面表现出了很强的优势,提高了目标检测和语义分割的能力。我们相信,这些好处可以扩展到更广泛的领域,其中分类基础模型是受欢迎的。

  • 相关阅读:
    运行从别处复制过来的linux可执行程序
    查看linux服务器版本
    编码问题
    Programmer Dvorak键盘布局
    Ubuntu下安装JDK图文解析
    数据结构和算法设计专题之---24点游戏(穷举法和递归法)
    数据结构和算法设计专题之---单链表的逆序
    Android中实现静态的默认安装和卸载应用
    J2EE学习篇之--JQuery技术详解
    MyEclipse6.0中使用aptana插件,添加jquery提示功能
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/12832529.html
Copyright © 2011-2022 走看看