EfficientNet理论讲解

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

论文地址:https://arxiv.org/abs/1905.11946
原代码:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
霹雳吧啦Wz使用Pytorch实现的代码: pytorch_classification/Test9_efficientNet
霹雳吧啦Wz使用Tensorflow实现的代码: tensorflow_classification/Test9_efficientNet

0. 引言

在之前的一些手工设计网络中(AlexNet,VGG,ResNet等等)经常有人问,为什么输入图像分辨率要固定为224,为什么卷积的个数要设置为这个值,为什么网络的深度设为这么深

这些问题你要问设计作者的话,估计回复就四个字——工程经验。

而这篇论文(EfficientNet)主要是用 NAS(Neural Architecture Search)技术来搜索网络的图像输入分辨率 r r r,网络的深度 depth \text{depth} depth 以及 channel \text{channel} channel 的宽度 width \text{width} width 三个参数的合理化配置。在之前的一些论文中,基本都是通过改变上述3个参数中的一个来提升网络的性能,而这篇论文就是同时来探索这三个参数的影响。

在论文中提到,本文提出的EfficientNet-B7在Imagenet top-1上达到了当年最高准确率84.3%,与之前准确率最高的GPipe相比,参数数量(Params)仅为其1/8.4,推理速度提升了6.1倍(看上去又快又轻量,但个人实际使用起来发现很吃显存)。下图是EfficientNet与其他网络的对比(注意,参数数量少并不意味推理速度就快)。

在这里插入图片描述

图1。模型尺寸与ImageNet精度。所有数据都是单一裁剪,单一模型的。我们的EfficientNets明显优于其他ConvNets。特别是,EffecentNet-B7实现了新的最先进的84.3% top-1精度,但比GPipe小8.4倍,快6.1倍。EffecentNet-B7比ResNet-152小7.6倍,快5.7倍。详情见表2和表4。

1. 论文动机(思想)

1.1 网络性能的三个参数 —— w , d , r w, d, r w,d,r

在这里插入图片描述

在之前的一些论文中:

  • 有的会通过增加网络的宽度width增加卷积核的个数(增加特征矩阵的channels) 来提升网络的性能如图(b)所示
    • 优点:增加网络的width能够获得更高细粒度的特征并且也更容易训练
    • 缺点:对于width很大而深度较浅的网络往往很难学习到更深层次的特征
  • 有的会通过增加网络的深度depth使用更多的层结构来提升网络的性能如图©所示
    • 优点:根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中
    • 缺点:但网络的深度过深会面临梯度消失,训练困难的问题。
  • 有的会通过增加输入网络的分辨率来提升网络的性能如图(d)所示。
    • 优点:增加输入网络的图像分辨率能够潜在得获得更高细粒度的特征模板。
    • 缺点:但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。

而在本篇论文中会同时增加网络的width、网络的深度以及输入网络的分辨率来提升网络的性能如图(e)所示。

1.2 单独 w , d , r w, d, r w,d,r时的网络性能

下图展示了在基准EfficientNetB-0上分别增加width、depth以及resolution后得到的统计结果。

在这里插入图片描述

通过下图可以看出大概在Accuracy达到80%时就趋于饱和了。

1.3 固定 w w w,看 d , r d, r d,r对网络性能的影响

接着作者又做了一个实验,采用不同的 d , r d, r d,r 组合,然后不断改变网络的width w w w就得到了如下图所示的4条曲线。

在这里插入图片描述

通过分析可以发现在相同的FLOPs下,同时增加 d d d r r r 的效果最好。

2. EfficientNet-B0

2.1 EfficientNet-B0网络架构

为了方便后续理解,我们先看下论文中通过 NAS(Neural Architecture Search) 技术搜索得到的EfficientNetB0的结构,如下图所示,整个网络框架由一系列Stage组成, F i ^ \hat{F_i} Fi^ 表示对应Stage的运算操作, L i ^ \hat{L_i} Li^表示在该Stage中重复的次数 F i ^ \hat{F_i} Fi^

在这里插入图片描述

MBConv就是MobileNet v3的Block
Resolution中的尺度是针对该stage的输入尺寸(而非输出)。
上表中下采样操作是在MBConv中第一个完成的

2.2 MBConv

在这里插入图片描述

和MobileNet v3中的block是一样的。

Note:

  • 只有使用到shortcut的MBConv才有Dropout层
  • shortcut连接当且仅当MBConv的输入和输出特征图shape相同时才会使用
    当MBConv不进行升维操作时,第一个负责升维的1×1卷积(PWConv)就不要了,直接DWConv(与MobileNet v3是一样的)

2.3 SE模块

在这里插入图片描述

  1. 第一个FC之后是Swish激活函数,第二个FC之后是Sigmoid激活函数
  2. FC降为不是当前feature map channel的1/4而是MBConv输入feature map的1/4

3. EfficientNet所有版本对应参数设置

Model Input size width_coefficient depth_coefficient drop_connect_rate dropout_rate
EfficientNet-B0 224×224 1.0 1.0 0.2 0.2
EfficientNet-B1 240×240 1.0 1.1 0.2 0.2
EfficientNet-B2 260×260 1.1 1.2 0.2 0.3
EfficientNet-B3 300×300 1.2 1.4 0.2 0.3
EfficientNet-B4 380×380 1.4 1.8 0.2 0.4
EfficientNet-B5 456×456 1.6 2.2 0.2 0.4
EfficientNet-B6 528×528 1.8 2.6 0.2 0.5
EfficientNet-B7 600×600 2.0 3.1 0.2 0.5
  • width_coefficient代表channel维度上的倍率因子(取整到离他最近的8的整数倍)
  • depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8的 L L L)-> L × depth_coefficient L \times \text{depth\_coefficient} L×depth_coefficient 向上取整

4. EfficientNet与其他网络的性能对比

在这里插入图片描述

5. 总结

EfficientNet系列的网络虽然有着最高的准确率和参数量,但由于输入图片的尺寸比较大,很占GPU显存,而且实际运行速度并不理想(FLOPs是一个间接指标,真实的推理速度才是直接指标)

参考

  1. https://www.bilibili.com/video/BV1XK4y1U7PX?spm_id_from=333.999.0.0
  2. https://blog.csdn.net/qq_37541097/article/details/114434046

猜你喜欢

转载自blog.csdn.net/weixin_44878336/article/details/124990203
今日推荐