一、参考资料
原始论文:[1]
github代码:efficientnet
EfficientNet系列(1): EfficientNetV2网络详解
EfficientNet网络详解
二、EfficientNet相关介绍
在之前的文章中,单独增加图像分辨率或增加网络深度或单独增加网络的宽度,来提高网络的准确率。在EfficientNet这篇论文中,作者使用网络搜索技术(NAS)去同时探索网络的 宽度(width),深度(depth),分辨率(resolution)对模型准确率的影响。
1. width、depth、resolution对网络的影响
宽度(
width),表示特征图的通道数(channels),channels越多,网络越宽;深度(
depth),表示网络层(layers)的深度,layers越多,网络越深;分辨率(
resolution),表示输入图像的分辨率,输入图像的分辨率越大,输出特征图尺寸越大。
根据以往的经验,width、depth、resolution 对网络的影响如下:
-
增加网络的
depth能够得到更加丰富、复杂的特征并且能够很好的应用到其他任务中。但网络的深度过深会面临梯度消失,训练困难的问题。 -
增加网络的
width能够获得更细粒度的特征并且也更容易训练,但对于width很大而且深度较浅的网络,往往很难学习到更深层次的特征。 -
增加输入图像的
resolution能够潜在得获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确度的增益也会减少。并且大分辨率图像会增加计算量。

解释说明:
- 图a,是基准网络,表示传统的卷积神经网络;
- 图b,在图a的基础上单独增加网络的
宽度; - 图c,在图a的基础上单独增加网络的
深度; - 图d,在图a的基础上单独增加图像的
分辨率; - 图e,对网络同时增加网络的
宽度、深度以及输入图像的分辨率。

从上图可以看出,scale by width,scale by depth,scale by resolution,这三条虚线在准确率达到80%后达到饱和,准确率不再增加。对于红色的线,同时增加网络的width、depth、resolution,它达到了80%的准确率后并没有出现饱和的现象,并且还可以继续增长。说明同时增加网络的width、depth、resolution,可以得到一个更好的结果。并且当理论的计算量相同时,同时增加网络的width、depth、resolution,网络的效果会更好。
2. EfficientNet-B0 Network
下表为 EfficientNet-B0 的网络框架,可以看出网络总共分成了9个Stage,第一个Stage就是一个卷积核大小为3x3步距为2的普通卷积层(包含BN和Swish激活函数),Stage2~Stage8都是在重复堆叠MBConv结构,而 Stage 9 由3部分构成:一个普通的1x1的卷积层(包含BN和Swish激活函数),一个平均池化层和一个全连接层组成。

表格中每个MBConv后会跟一个数字1或6,这里的1或6就是倍率因子n,即MBConv中第一个1x1的卷积层会将输入特征矩阵的channels扩充为n倍,其中k3x3或k5x5表示MBConv中Depthwise Conv所采用的卷积核大小。Channels表示通过该Stage后输出特征图的Channels。
Resolution,对应每个Stage输入特征图尺寸;Channels,对应每个Stage输出特征图的channels;Layers,表示该Stage重复堆叠MBConv结构多少次,比如stage3对应的Layers为2,则对MBConv6重复两次;stride,对应Layers的第一层的stride,其他的stride都等于1。
2.1 MBConv 模块
MBConv模块与 MobileNetV3 网络中的Inverted Residual Block类似,不同的是,MBConv模块中使用Swish激活函数,MobileNetV3网络中使用h-swish激活函数;每个MBConv模块都加入SE模块。MBConv模块的结构如下图所示:

图片来源:EfficientNet网络详解
解释说明:
Conv 1x1, s1层,一个1x1的标准卷积,用于升维,然后通过BN以及Swish激活函数;Depwise Conv, kxk, s1/s2层,一个kxk的逐深度卷积(DWConv),然后通过BN和Swish激活函数。k的具体值取决于EfficientNet的网络框架,主要有3x3和5x5两种情况;- SE模块,后文有介绍;
Conv 1x1, s1层,一个1x1的标准卷积,用于降维,然后通过一个BN,没有swish激活函数。Droupout层,其dropout_rate对应的是drop_connect_rate;shortcut连接,执行add操作。
这里需要注意几个点:
- 第一个升维的
1x1卷积层,它的卷积核个数是输入特征图channels的n倍, n ∈ { 1 , 6 } n \in \left\{1, 6\right\} n∈{1,6}。 - 当
n
=
1
n = 1
n=1 时,不要第一个升维的
1x1卷积层,即Stage2中的MBConv结构没有第一个升维的1x1卷积层; - 关于
shortcut连接,仅当输入MBConv模块的特征图与输出特征图的尺寸相同,进行shortcut连接; - 只有使用
shortcut连接时才有Dropout层。
2.2 SE(Squeeze-and-Excitation)模块
如下图所示,SE模块由一个全局平均池化(AvgPooling),两个FC层组成。第一个全连接层的节点个数是 MBConv 模块的输入特征图 channels 的
1
4
\frac{1}{4}
41 ,且使用 Swish激活函数。第二个全连接层的节点个数等于 MBConv模块中 DWConv 层输出特征图的 channels,且使用 Sigmoid激活函数。
简单理解,SE模块的总体思想是:给每个特征图不同的权重,关注更有用的特征。

3. EfficientNet(B0-B7)
EfficientNet-B1~ EfficientNet-B7 就是在EfficientNet-B1的基础上修改Resolution,Channels以及Layers 得到的。EfficientNet(B0-B7)网络参数,如下表:
| Model | input_size | width_coefficient | depth_coefficient | drop_connect_rate | dropout_rate |
|---|---|---|---|---|---|
| EfficientNetB0 | 224x224 | 1.0 | 1.0 | 0.2 | 0.2 |
| EfficientNetB1 | 240x240 | 1.0 | 1.1 | 0.2 | 0.2 |
| EfficientNetB2 | 260x260 | 1.1 | 1.2 | 0.2 | 0.3 |
| EfficientNetB3 | 300x300 | 1.2 | 1.4 | 0.2 | 0.3 |
| EfficientNetB4 | 380x380 | 1.4 | 1.8 | 0.2 | 0.4 |
| EfficientNetB5 | 456x456 | 1.6 | 2.2 | 0.2 | 0.4 |
| EfficientNetB6 | 528x528 | 1.8 | 2.6 | 0.2 | 0.5 |
| EfficientNetB7 | 600x600 | 2.0 | 3.1 | 0.2 | 0.5 |
参数解释:
input_size,表示输入特征图尺寸;width_coefficient,表示channel维度上的倍率因子。比如在EfficientNetB0中Stage1的3x3卷积层所使用的卷积核个数是32,那么在B6中就是 32 × 1.8 = 57.6 32 \times 1.8=57.6 32×1.8=57.6,然后取整到离它最近的8的整数倍即56,其它Stage同理;- depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8),比如在EfficientNetB0中Stage7的 L ^ i = 4 {\widehat L}_i=4 L i=4,那么在B6中就是 4 × 2.6 = 10.4 4 \times 2.6=10.4 4×2.6=10.4,然后向上取整即11;
drop_connect_rate是在MBConv结构中dropout层使用的dropout_rate,在官方keras模块的实现中MBConv结构的drop_rate是从0递增到drop_connect_rate,具体实现可以看下官方源码;dropout_rate是最后一个全连接层前的dropout层(在stage9的Pooling与FC之间)的dropout_rate。
三、参考文献
[1] Tan M, Le Q. Efficientnet: Rethinking model scaling for convolutional neural networks[C]//International conference on machine learning. PMLR, 2019: 6105-6114.



















