以下内容摘自《Bag of Tricks for Image Classification with Convolutional Neural Networks》。

1 高效训练

1.1 大batch训练

当我们有一定资源后,当然希望能充分利用起来,所以通常会增加batch size来达到加速训练的效果。但是,有不少实验结果表明增大batch size可能降低收敛率,所以为了解决这一问题有人以下方法可供选择:

1.1.1 线性增加学习率

一句话概括就是batch size增加多少倍,学习率也增加多少倍

例如最开始batch size=256时, lr=0.1。后面batch size变成b后,lr=\(0.1\times \frac{b}{256}\)

1.1.2 学习率warmup

在训练最开始,所有的参数都是随机初始化的,因此离最终的解还需要很多次迭代才能到达。一开始使用一个太大的学习率会导致不稳定,所以可以在最开始使用一个很小的学习率,然后逐步切换到默认的初始学习率。

例如我们可以设定在前面100个batch学习率由0线性增加到默认初始值0.1,也就是说每个batch学习率增加0.001

1.1.3 \(\gamma=0\) for BN layer

现在很多网络结构中都会用到BatchNorm层,而我们知道BN层会对数据作如下操作:

1.标准化输入: \(\hat{x_1}=\text{standardize}(x)\)
2.伸缩变换(scale transformation): \(\hat{x_2}=\gamma\hat{x_1}+\beta\)

上面步骤中的\(\gamma,\beta\)都是可学习的参数,分别初始化为0,1。

原文解释这样做的好处如下(没太懂什么意思,懂得麻烦解释一下):

Therefore, all residual blocks just return their inputs, mimics network that has less number of layers and is easier to train at the initial stage.

1.1.4 No bias decay

意思就是我们可以weight decay,但是不用做bias decay

1.2 低精度训练

P. Micikevicius,et al. Mixed precision training.中提出将所有的参数和激活值用FP16存储,并且使用FP16来计算梯度。另外,所有的参数都需要一份FP32的拷贝用来做参数更新。另外将loss乘上一个标量以便求得的梯度范围可以与FP16对齐。

2. 模型设计Trick

下面以ResNet为例进行介绍有哪些模型设计的Trick。

下图示何凯明提出的ResNet的示意图,可以看到主要由三部分组成:

  • input stem:主要是先用一个7*7的卷积核,后接一个最大池化
  • stage2-4:每个stage最开始是先用下采样模块对输入数据维度做减半操作,注意不是直接使用池化,而是通过设置卷积stride=2实现的。下采样之后后接若干个残差模块。
  • output:最后接上预测输出模块

下面介绍一下可以对上面的ResNet做哪些魔改:

  • input stem改!

可以看到主要将7*7的卷积核改成了3个3*3的卷积核,这样效果类似,而且参数更少。

  • stage中的down sampling部分的Path A和Path B都可以改:

    • Path A:将stride=2从原来的1*1卷积核部分改到了3*3卷积核内
    • Path B:该条路径只有一个卷积操作,没法像上面那样,所以加入了一个池化层。

实验结果:

Model #params FLOPs Top-1 Top-5
ResNet-50 25 M 3.8 G 76.21 92.97
ResNet-50-B 25 M 4.1 G 76.66 93.28
ResNet-50-C 25 M 4.3 G 76.87 93.48
ResNet-50-D 25 M 4.3 G 77.16 93.52

3. 训练Trick

3.1 Cosine learning rate decay

计算公式如下:

\[
\eta_{t}=\frac{1}{2}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) \eta
\]
其中\(\eta\)是初始化学习率。

示意图如下:

3.2 label smoothing

这个方法我在之前的一个项目中用过,但是感觉没什么效果,所以各种Trick还是得视情况而定,并不是万能的。

通常分类任务中每张图片的标签是one hot形式的,也就是说一个向量在其对应类别索引上设置为1,其他位置为0,形如[0,0,0,1,0,0]。

label smoothing就是将类别分布变得平滑一点,即

\[
q_{i}=\left\{\begin{array}{ll}{1-\varepsilon} & {\text { if } i=y} \\ {\varepsilon /(K-1)} & {\text { otherwise }}\end{array}\right.
\]
其中\(q_{i}\)就代表某一类的ground truth,例如如果\(i==y\),那么其最终真实值就是\(1-\varepsilon\),其它位置设置为\(\varepsilon /(K-1)\),而不再是。这里的\(\varepsilon\)是一个很小的常数。

3.3 Mixup

方法如下:

每次随机抽取两个样本进行加权求和得到新的样本,标签同样做加权操作。公式中的\(\lambda\in[0,1]\)是一个随机数,服从\(\text{Beta}(\alpha,\alpha)\)分布。

\[
\begin{aligned} \hat{x} &=\lambda x_{i}+(1-\lambda) x_{j} \\ \hat{y} &=\lambda y_{i}+(1-\lambda) y_{j} \end{aligned}
\]

MARSGGBO♥原创







2019-9-4

Bag of Tricks for Image Classification with Convolutional Neural Networks笔记的更多相关文章

  1. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  2. Bag of Tricks for Image Classification with Convolutional Neural Networks

    这篇文章来自李沐大神团队,使用各种CNN tricks,将原始的resnet在imagenet上提升了四个点.记录一下,可以用到自己的网络上.如果图片显示不了,点击链接观看 baseline mode ...

  3. Bag of Tricks for Image Classification with Convolutional Neural Networks论文笔记

    一.高效的训练     1.Large-batch training 使用大的batch size可能会减小训练过程(收敛的慢?我之前训练的时候挺喜欢用较大的batch size),即在相同的迭代次数 ...

  4. Convolutional Neural Networks 笔记

    1 Foundations of Convolutional Neural Networks 1.1 cv问题 图像分类.目标检测.风格转换.但是高像素的图片会带来许多许多的特征. 1.2 边缘检测( ...

  5. Notes on Large-scale Video Classification with Convolutional Neural Networks

    Use bigger datasets for CNN in hope of better performance. A new data set for sports video classific ...

  6. Deep learning_CNN_Review:A Survey of the Recent Architectures of Deep Convolutional Neural Networks——2019

    CNN综述文章 的翻译 [2019 CVPR] A Survey of the Recent Architectures of Deep Convolutional Neural Networks 翻 ...

  7. 《ImageNet Classification with Deep Convolutional Neural Networks》 剖析

    <ImageNet Classification with Deep Convolutional Neural Networks> 剖析 CNN 领域的经典之作, 作者训练了一个面向数量为 ...

  8. 读convolutional Neural Networks Applied to House Numbers Digit Classification 的收获。

    本文以下内容来自读论文以后认为有价值的地方,论文来自:convolutional Neural Networks Applied to House Numbers Digit Classificati ...

  9. [转]XNOR-Net ImageNet Classification Using Binary Convolutional Neural Networks

    感谢: XNOR-Net ImageNet Classification Using Binary Convolutional Neural Networks XNOR-Net ImageNet Cl ...

随机推荐

  1. docker 学习操作记录 5

    记录5 * Overheard at KubeCon: "microk8s.status just blew my mind". https://microk8s.io/docs/ ...

  2. thinkphp5的钩子怎么用

    1.创建钩子行为 我们自己定义的标签位可以直接放在Think\Behaviors中,也可以放在应用目录中,比如说Home模块下,新建一个Behaviors的文件夹,在文件夹内新建: 标签名+Behav ...

  3. Lab_1:练习5——实现函数调用堆栈跟踪函数

    题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址.如 ...

  4. VisualStudio ------- vs发布软件

    上线的系统和自己做的系统有什么区别 上线的没有源代码,没有实体层,数据库访问层  业务逻辑层 只有表现层  而且也也没有    .cs 和 .psd   文件,这样就不能修改系统代码 他们都在 Web ...

  5. 源码casino-server剖析(1)--游戏服务的整体架构和实现

    前言: 最近研究了一些游戏服务器的架构和实现, github上找了几个开源的实现. 有几个感觉不错, 打算仔细研读一下. 游戏服务器种类繁多, 这边主要是基于状态同步的棋牌类游戏, 适合入门, ^_^ ...

  6. Replication:The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'

    今天早上,Dev跟我说,执行query statement时出现一个error,detail info是: “The transaction log for database 'tempdb' is ...

  7. eclipse从svn检出maven项目

    使用Eclipse从svn检出项目. 打开Eclipse,在project explorer空白区域右键鼠标移至import选择import. 2 之后选择svn-->从svn检出项目,然后输入 ...

  8. node-exporter常用指标含义,比如在prometheus中查询node_load1的指标数据

    参考: https://blog.csdn.net/yjph83/article/details/84909319 https://www.gitbook.com/book/songjiayang/p ...

  9. 2019 珍岛java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.珍岛等公司offer,岗位是Java后端开发,因为发展原因最终选择去了珍岛,入职一年时间了,也成为了面试官,之 ...

  10. jquery实现简单定时轮播图

    JS $(document).ready(function(){ var index = 0; //刚开始设置一个index,index为图片的索引值 $(".pictureDemo img ...