一、参考资料
原始论文:[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.