锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【论文翻译】Bag of Tricks for Image Classification with Convolutional Neural Networks

时间:2023-02-04 22:00:00 20zj1b矩形连接器

一系列利用卷积神经网络进行图像分类的技能

摘要

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

1. 引言

自 2012 年引入 AlexNet [15] 深度卷积神经网络已成为图像分类的主要方法。从那时起,包括 VGG [24]、NiN [16]、Inception [1]、ResNet [9]、DenseNet [13] 和 NASNet [34]。同时,我们看到了模型精度提高的稳定趋势。例如,ImageNet [23] 上的 top-1 验证准确性已从 62.5% (AlexNet) 提高到 82.7% (NASNet-A)。

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

在本文中,我们将研究一系列的训练过程和模型架构改进,它们可以提高模型的准确性,但几乎不会改变计算的复杂性。其中许多是小的技能,如修改特定层的步幅或调整学习率计划。然而,总的来说,它们会有很大的不同。我们将评估它们在多个网络架构和数据集中,并报告它们对最终模型准确性的影响。
在这里插入图片描述

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

Paper Outline. 我们首先在第 2 节中设置了baseline训练程序,然后在第一位 3 本节讨论了一些有助于新硬件有效训练的技巧。在第 4 我们回顾了节日 ResNet 调整了三个小模型架构,并提出了一个新的。然后在第 5 本节讨论了四个额外的训练过程改进。最后,我们在第一 6 研究这些更准确的模型是否有助于迁移学习。

我们的模型实现和训练脚本 GluonCV公开可用。

2. 训练程序

算法中使用小批量随机梯度下降训练神经网络的模板 1 所示。在每次迭代中,我们随机采样 b 计算梯度,然后更新网络参数。训练数据集K次后停止。 1 所有函数和超参数都可以通过多种不同的方式实现。本节首先指定算法 1 的baseline 实现。

2.1. baseline 训练程序

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

  1. 随机采样图像,解码为 [0, 255] 中的 32 原始像素值的位浮点。
  2. 随机切割矩形区域,其纵横比在 [3/4, 4/3] 随机采样,区域在 [8%, 100%] 随机采样,然后将切割区调整为 224×224 正方形图像。
  3. 以 0.5 的概率水平翻转。
  4. 使用从 [0.6, 1.4] 将色调、饱和度和亮度降低为统一绘制系数。
  5. 从正态分布增加 N ( 0 , 0.1 ) N (0, 0.1) N(0,0.1) 采样系数 PCA 噪声。
  6. 分别减去 123.68、116.779、103.939 并除以 58.393、57.12、57.375 来归一化 RGB 通道。

在验证期间,我们将每个图像的短边调整为 256 同时保持像素的纵横比。接下来,我们将中心切割 224×224 区域,并对 RGB 与训练类似,通道被归一化。验证期间不进行任何随机扩展。

使用卷积层和全连接层的权重 Xavier 算法 [6] 初始化。特别是,我们将参数设置为从 [ ? a , a ] [?a, a] [?a,a] 均匀提取的随机值,包括 a = 6 / ( d i n d o u t ) a=\sqrt{6 /\left(d_{i n} d_{o u t}\right)} a=6/(din+dout) 。这里 d i n d_{in} din d o u t d_{o u t} dout分别是输入和输出通道的大小。所有biases都初始化为 0。对于批量归一化层, γ γ γ 向量初始化为 1, β β β 向量初始化为 0。

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

2.2.实验结果

我们评估了三个 CNN:ResNet-50 [9]、InceptionV3 [1] 和 MobileNet [11]。对于 Inception-V3,我们将输入图像的大小调整为 299x299。我们使用 ISL VRC2012 [23] 数据集,该数据集有 130 万张用于训练的图像和 1000 个类。验证准确率如表 2 所示。可以看出,我们的 ResNet-50 结果略好于参考结果,而我们的基线 Inception-V3 和 MobileNet 由于不同的训练过程,准确率略低。

3. 高效训练

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

3.1. 大批量训练

Mini-batch SGD 将多个样本分组到一个小批量中,以增加并行度并降低通信成本。但是,使用大批量可能会减慢训练进度。对于凸问题,收敛速度会随着批量大小的增加而降低。神经网络[25]也报道了类似的经验结果。换句话说,对于相同数量的 epoch,与使用较小批量训练的模型相比,使用大批量进行训练会导致模型的验证准确度下降。

线性缩放学习率。在 mini-batch SGD 中,梯度下降是一个随机过程,因为样本是在每批中随机选择的。增加批量大小不会改变随机梯度的期望值,但会降低其方差。换句话说,大的batch size会减少梯度中的噪声,因此我们可能会增加学习率以沿着梯度相反的方向取得更大的进步。Goyal等人 [7] 报告说,随着批次大小线性增加学习率对于 ResNet-50 训练有效。特别是,如果我们遵循 He 等人 [9]选择0.1作为batch size 256的初始学习率,然后当更改为更大的batch size b时,我们将初始学习率增加到 0.1 × b / 256 0.1×b/256 0.1×b/256

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

Zero γ。ResNet网络由多个残差块组成,每个残差块由多个卷积层组成。给定输入 x x x,假设 b l o c k ( x ) block(x) block(x)是块中最后一层的输出,然后剩余的块输出 x + b l o c k ( x ) x +block(x) x+block(x)。请注意,块的最后一层可以是批处理规范化(BN)层。BN层首先对输入进行标准化 x ^ \hat{x} x^,然后执行尺度转换 γ x ^ + β γ\hat{x}+ β γx^+β γ γ γ β β β都是可学习的参数,它们的元素分别初始化为1和0。在zero γ γ γ初始化启发式中,我们对位于残差块末端的所有BN层初始化 γ = 0 γ = 0 γ=0。因此,所有的剩余块都只是返回它们的输入,模仿了层数较少,在初始阶段更容易训练的网络。

无bias衰减。权重衰减通常应用于所有可学习参数,包括权重和偏差。这相当于对所有参数应用 L 2 L2 L2正则化,使其值趋近于0。然而,正如Jia等[14]所指出的,建议只对权值进行正则化,以避免过拟合。无偏差衰减启发式算法遵循这一建议,它只将权值衰减应用于卷积层和全连通层中的权值。其他参数,包括bias和 γ γ γ β β β在BN层,保留非正则化。

请注意,LARS [4] 提供逐层自适应学习率,并且据报道对于非常大的批量大小(超过 16K)有效。虽然在本文中,我们将自己限制在足以用于单机训练的方法上,但在这种情况下,不超过 2K 的批大小通常会带来良好的系统效率。

3.2.低精度训练

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

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

3.3.实验结果

ResNet-50 的评估结果如表 3 所示。与批大小为 256 和 FP32 的基线相比,使用更大的 1024 批大小和 FP16 将 ResNet-50 的训练时间从每 epoch 13.3 分钟减少到 4.4 分钟每个时代。此外,通过堆叠大批量训练的所有启发式方法,使用 1024 批量大小和 FP16 训练的模型与基线模型相比甚至略微提高了 0.5% 的 top-1 准确率。

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

4. 模型调整

模型调整是对网络架构的微小调整,例如更改特定卷积层的stride。这种调整通常几乎不会改变计算复杂度,但可能会对模型精度产生不可忽视的影响。在本节中,我们将使用 ResNet 作为示例来研究模型调整的效果。

4.1 ResNet 架构

我们将简要介绍 ResNet 架构,尤其是与模型调整相关的模块。有关详细信息,请参阅 He 等人 [9]。 ResNet 网络由一个 input stem、四个subsequent stages和一个final output 层组成,如图 1 所示。 input stem有一个 7×7 的卷积,输出通道为 64,stride为 2,然后是一个 3 × 3 最大池化层,stride也为 2。input stem将输入宽度和高度减少了 4 倍,并将其通道大小增加到 64。

从stage 2 开始,每个stage都以一个下采样块开始,然后是几个残差块。在下采样块中,有路径 A 和路径 B。路径 A 有三个卷积,其内核大小分别为 1×1、3×3 和 1×1。第一个卷积的stride为 2,将输入宽度和高度减半,最后一个卷积的输出通道比前两个大 4 倍,称为瓶颈结构。路径 B 使用stride为 2 的 1×1 卷积将输入形状转换为路径 A 的输出形状,因此我们可以将两条路径的输出相加得到下采样块的输出。残差块类似于下采样块,只是只使用stride为 1 的卷积。

可以通过改变每个stage的残差块数量来获得不同的 ResNet 模型,例如 ResNet-50 和 ResNet-152,其中数字表示网络中卷积层的数量。

4.2. ResNet 调整

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

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

ResNet-C。这种调整最初是在 Inception-v2 [26] 中提出的,它可以在其他模型的实现中找到,例如 SENet [12]、PSPNet [31]、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.实验结果

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


结果表明,与 ResNet50 相比,ResNet-B 在下采样块的路径 A 中接收到更多信息,并提高了约 0.5% 的验证准确度。用三个 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. 训练改进

在本节中,我们将描述旨在进一步提高模型准确性的四种训练改进。

5.1 余弦学习率衰减

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

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

η t = 1 2 ( 1 + cos ⁡ ( t π T ) ) η ( 1 ) \eta_{t}=\frac{1}{2}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) \eta (1) ηt=21(1+cos(Ttπ))η1

其中 η η η 是初始学习率。我们将这种调度称为“余弦(cosine)”衰减。

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

5.2.标签平滑

图像分类网络的最后一层通常是一个全连接层,其隐藏大小等于标签的数量,用 K 表示,以输出预测的置信度分数。给定一张图像,用 z i z_i zi表示第 i i i 类的预测分数。这些分数可以通过 s o f t m a x softmax softmax 算子进行归一化以获得预测概率。用 q q q 表示 s o f t m a x softmax softmax 算子的输出 q = s o f t m a x ( z ) q = softmax(z) q=softmax(z),类 i i i 的概率 q i q_i qi 可以通过以下方式计算:
q i = exp ⁡ ( z i ) ∑ j = 1 K exp ⁡ ( z j ) ( 2 ) q_{i}=\frac{\exp \left(z_{i}\right)}{\sum_{j=1}^{K} \exp \left(z_{j}\right)} (2) qi=j=1Kexp(zj)exp(zi)2
很容易看出 q i > 0 q_i > 0 qi>0 ∑ j = 1 K q i = 1 {\sum_{j=1}^{K}q_i=1} j=1Kqi=1,所以 q q q 是一个有效的概率分布。

另一方面,假设该图像的真实标签是 y,我们可以构造一个真值概率分布,如果 i = y i = y i=y,则为 p i = 1 p_i = 1 pi=1,否则为 0。在训练期间,我们最小化负交叉熵损失
ℓ ( p , q ) = − ∑ i = 1 K q i log ⁡ p i ( 3 ) \ell(p, q)=-\sum_{i=1}^{K} q_{i} \log p_{i} (3) (p,q)=i=1Kqilogpi3

来更新模型参数,使这两个概率分布彼此相似。特别是,通过 p 的构造方式,我们知道 ℓ ( p , q ) = − l o g p y = − z y + l o g ( ∑ i = 1 K e x p ( z i ) ) {\ell(p, q)= − log p_y = −z_y + log (\sum_{i=1}^{K} exp(zi) ) } (p,q)=logpy=zy+log(i=1Kexp(zi))。最优解决方案是 z y ∗ = i n f z^*_y = inf zy=inf,同时保持其他节点足够小。换句话说,它鼓励了输出分数的显著差异,这可能会导致过拟合。

为了训练Inception-v2[26],首先提出了标签平滑的思想。它将真实概率的构造变成
q i = { 1 − ε  if  i = y ε / ( K − 1 )  otherwise  ( 4 ) q_{i}= \begin{cases}1-\varepsilon & \text { if } i=y \\ \varepsilon /(K-

相关文章