【论文笔记】CNN图像分类Tricks合集

paper:Bag of Tricks for Image Classification with Convolutional Neural Networks
author: Tong He, Zhi Zhang, Hang Zhang, Zhongyue Zhang, Junyuan Xie, Mu Li (Amazon Web Services)
code:https://github.com/dmlc/gluon-cv

1. Introduction

自2012年AlexNet的问世以来,深度神经网络已经成为了图像分类领域的主流方法,很多新的结构被提出,例如VGG,NiN,Inception,ResNet,DenseNet,NasNet等。同时我们看到了模型精度的稳步提升,比如在ImageNet上top1的validation acc已经从AlexNet的62.5%提升到了NASNet-A的82.7%。
不过这些精度的提升不单单是因为模型结构的改进。训练过程的改进,包括损失函数的改变、数据预处理和优化方法也发挥了重要作用。 在过去几年中已经提出了大量这样的改进,但是受到的关注相对较少。在文献中,大多数只是作为实现细节简要提及,而其他只能在源代码中找到。
本文将验证不同的训练过程优化和模型结构优化的tricks对提升精度的影响。其中很多tricks都是很微小的改进,例如调整某一个卷积层的stride,或调整学习率等。但总的来说,这些小的改变累加起来会达到一个很大的提升。论文将在不同的网络结构和数据集上评估这些tricks,并报告它们对最终模型精度的影响。
文章中的实证评估表明,一些特定的技巧可以显著提高模型的准确度,将它们组合在一起可以进一步提高模型的精度。在应用所有技巧之后,如表1所示,ResNet- 50在ImageNet上的top-1验证准确率从75.3%提高到79.29%,这一结果超越了其他更新和改进的网络架构,如SE-ResNeXt-50。此外,文章将提出的方法推广到其他网络(Inception V3[1]和MobileNet[11])和数据集(Place365[32]),以及其他应用领域(如目标检测和语义分割)中,同样可以带来良好的性能。
在这里插入图片描述

2. 训练过程

2.1 Baseline训练过程

通常训练一个神经网络会采用mini-batch SGD,如Algorithm 1所示。每个iter随机采样b张图片计算梯度然后更新网络参数。
在这里插入图片描述
关于超参和各函数有很多种实现方式,我们首先明确在我们的baseline中是如何实现的。
我们按照广泛使用的ResNet的实现作为baseline,训练过程主要分为以下六个步骤:

  1. 随机采样一张图片,将其解码成 32 位的原始像素浮点值,每一个像素值的取值范围为 [0, 255]。
  2. 随机以 [3/4, 4/3] 为长宽比、[8%, 100%] 为面积比,裁减矩形区域,然后再缩放为 224*224 的方图。
  3. 以 0.5 的概率随机水平翻转图像。3.以 0.5 的概率随机水平翻转图像。
  4. 从均匀分布 [0.6, 1.4] 中采样系数,用于缩放hue, saturation, and brightness等。
  5. 从正态分布 N \mathcal{N} N(0, 0.1) 中采样系数,用于添加 PCA 噪声。
  6. 图像归一化,RGB通道分别减去(123.68, 116.779, 103.939)再除以(58.393, 57.12, 57.375)。

验证阶段将每张图片的短边resize到256,保持其长宽比,然后在其中心位置裁剪224*224的区域,并做归一化(同训练)。在验证阶段没有做任何随机数据增强。
conv和fc层的参数都通过Xavier进行初始化,参数随机采样自均匀分布[-a,a],其中a= 6 / ( d i n + d o u t ) \sqrt{6/(d_{in}+d_{out})} 6/(din+dout) ,这里 d i n d_{in} din d o u t d_{out} dout分别表示输入输出channel的维度。所有bias初始化为0。对于bn层, γ \gamma γ初始化为全1, β \beta β初始化为全0。
训练时采用Nesterov Accelerated Gradient(NAG)。每个模型训练120个epoch,使用8 V100训练,batchsize=256。初始lr=0.1,lr_steps=[30,60,90],分别下降为1/10。

2.2 实验结果

我们训练了3个模型:ResNet-50,Inception-V3和MobileNet。所用数据集是ILSVRC2012,包含1000类的130万训练图片。baseline的训练效果如表2所示,ResNet-50比reference稍好,Inception-V3和MobileNet比reference稍差因为训练过程不同。
在这里插入图片描述

3. 高效训练

3.1 大批量训练

对于凸优化问题,随着批量的增加,收敛速度会降低。也就是说,在相同的epoch数目下,用大的batchsize训练一个模型,比用小的batchsize训练模型的validation acc要低。
因此有很多工作致力于解决这个问题:

线性缩放学习率: 在mini-batch SGD中,梯度下降是一个随机的过程,因为每个batch中的样本是随机采样得到的。增加batchsize由于样本数增多了,会使得随机性有所降低,即较大的batchsize会减少梯度的噪声,这时可以通过增大学习率来加快收敛。按照[9],初始学习率设为0.1,batchsize=256,如果我们使用更大的batchsize b,则将初始学习率调整为0.1*b/256。

学习率预热: 初始使用较小的学习率,然后在训练过程变得稳定时换回初始学习率。按照[7],使用渐进的warmup策略,假设我们使用m个batch(e.g. 5 epochs)进行预热,初始学习率为 η \eta η,则在第i个batch所使用的学习率为 i ∗ η / m i*\eta/m iη/m

Zero γ \gamma γ 一个ResNet网络包含好多个residual blocks。每个block包括几个卷积层。给定输入x,假设block(x)为该block最后一层的输出,则整个residual block最终输出x+block(x)。注意,block的最后一层可以是BN层。BN层的操作为首先标准化其输入x得到 x ^ \hat{x} x^,然后做尺度变换 γ x ^ + β \gamma\hat{x}+\beta γx^+β,通常初始化为 γ = 1 , β = 0 \gamma=1,\beta=0 γ=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值