TensorFlow+Android经典模型从理论到实战(微课视频版)
上QQ阅读APP看书,第一时间看更新

1.4 EfficientNetV1解析

EfficientNet模型参见论文EfficientNetRethinking Model Scalingfor Convolutional Neural Networks(TAN M,LE Q.2019),采用自动机器学习(AutoML)和神经网络搜索(Neural Architecture Search,NAS)得到基准模型EfficientNetV1-B0。EfficientNetV1-B0相当于在网络深度(wider)、宽度(deeper)和图像分辨率(resolution)三个维度上得到合理化配置,然后通过复合系数ϕ对B0的宽度、深度和图像分辨率同时做混合缩放,得到一个优化模型系列,称为EfficientNetV1-B0~EfficientNetV1-B7,以满足不同规模的应用需求。

模型名称加上V1后缀是为了与后来的V2版本做区别。事实上,作者也在后来的V2论文中称呼之前的EfficientNet为V1版。

图1.9所示为EfficientNetV1与其他经典模型的比较。横轴用Number of Parameters(参数数量)表示模型规模,纵轴对比在ImageNet上的Top-1准确率。不难看出,EfficientNetV1从EfficientNetV1-B0到EfficientNetV1-B7,准确率有显著提升,其中EfficientNetV1-B0~EfficientNetV1-B4在模型规模增加不大的情况下,准确率提升幅度较为显著。从EfficientNetV1-B4到EfficientNetV1-B7,准确率提升幅度变小,模型规模增长相对变快,EfficientNetV1-B7达到了一个相对最好的水平。

图1.9 模型规模与准确率比较

根据论文报告,EfficientNetV1-B7取得SOTA(State Of The Art,当时最先进的)成绩,在ImageNet上的Top-1准确率为84.3%,与当时最好的模型GPipe相比,在准确率相当的情况下,模型的参数数量仅为其1/8.4,推理速度提升到6.1倍。

论文回顾了几种常见的模型缩放(scaling)方法,如图1.10所示。图1.10(a)为基准模型(baseline),图1.10(b)只对网络宽度缩放,图1.10(c)只对网络深度缩放,图1.10(d)只对输入图像的分辨率缩放,图1.10(e)是论文采用的方法,即在宽度、深度和图像分辨率三个维度上协同缩放(compound scaling)。

图1.10 模型缩放方法

增加网络深度,容易提取更复杂的特征,但深度过大会面临梯度消失、训练困难的问题。增加网络宽度,容易提取细粒度特征,但对于宽度较大而深度较浅的网络,往往很难学习到更深层次的特征。增加网络输入图像的分辨率,有助于细粒度特征提取,但计算量也会变大。

为寻求规模与效率上的最佳平衡点,论文给出了式(1.1)作为描述卷积神经网络的数学模型。式(1.2)作为优化目标,式(1.3)作为模型缩放方法。

卷积网络是由若干层组成的,第i个卷积层的逻辑可以被抽象为函数YiFiXi),Fi表示第i层的运算逻辑,Yi表示第i层的输出向量,Xi表示第i层的输入向量,维度为〈HiWiCi〉,为简化描述,此处省略了Xi中的样本数量维度。Hi表示特征图的高度,Wi表示特征图的宽度,Ci表示特征图的通道数。

基于上述描述,卷积网络N可以表示为若干卷积层的复合迭代运算,即

卷积网络整体运行逻辑一般划分为若干阶段(Stage),每个Stage由若干层(Layer)组成。这些Stage往往具备高度的结构相似性,因此,基于Stage的理念,卷积网络运算逻辑可由式(1.1)表示。

其中:

(1)表示连乘运算。

(2)表示Fi运算在第i个Stage中重复迭代Li次。

(3)X表示输入第i个Stage的特征矩阵。

(4)〈HiWiCi〉表示X的维度。随着网络深度的增加,HiWi会逐渐变小,Ci逐渐变大。例如,输入层的维度为〈224,224,3〉,经过若干Stage之后,变为〈7,7,512〉。此时,特征矩阵X的高度Hi与宽度Wi一般不会再变小了。

在EfficientNet之前,为了寻找最优网络,一般都是集中力量调整结构,在优化Fi逻辑上下功夫,但是EfficientNet不同。EfficientNet首先基于一个相对优化的基准结构,保持基准模型中每一层的Fi不变,在此基础上对LiCi和(HiWi)进行协同缩放。所以,EfficientNet模型可表示为式(1.2)所示的优化问题。

wdr分别表示宽度、深度和分辨率三个维度的缩放系数,表示基准模型中预定义的参数。其中:

(1)d用来缩放第i个Stage的深度

(2)r用来缩放第i个Stage输入矩阵的高度和宽度

(3)w用来缩放第i个Stage输入矩阵的通道数量

(4)target_memory为内存约束,target_flops为浮点计算量(FLOPs)约束。

基准模型EfficientNet-B0的结构定义如表1.2所示。

表1.2 EfficientNet-B0模型的结构定义

表1.2中每一行表示一个Stage,表示当前Stage包含的层数,()表示输入矩阵的高和宽,表示输出矩阵包含的通道数。为便于直观观察,图1.11给出了更为直观的模型结构与运算逻辑示意。

图1.11 EfficientNet-B0模型结构与运算逻辑

根据表1.2,EfficientNet-B0模型包含9个Stage。图1.11则包含8个Stage,不包括最后的输出层Stage。B0模型解析如下。

(1)第1个Stage是卷积核大小为3×3、步长为2的普通卷积层(包含BN和swish激活函数)。

(2)Stage2~Stage8则重复堆叠MBConv结构,表示当前Stage重复MBConv的次数。MBConv后面的数字1或者6,表示倍率因子(这里将倍率因子记作n),MBConv模块中的第一个1×1卷积负责将输入的特征矩阵的通道数扩充为n倍。3×3或5×5表示MBConv中深度可分离卷积所采用的卷积核大小。

(3)Stage9由一个标准的1×1卷积(包含BN和swish激活函数)、一个平均池化层和一个全连接层组成。

MBConv是MobileNet系列模型中的经典结构,EfficientNetV1做了一些变化,如图1.12所示,采用swish激活函数,加入SE(Squeeze-and-Excitation,压缩和激励)模块。SE模块的作用是沿着通道方向计算各特征层的权重,根据权重重新计算各特征层的取值,实现通道注意力机制。

图1.12 MBConv逻辑结构

MBConv结构解析如下。

(1)首先是一个标准的1×1卷积(包含BN和swish),用于根据倍率因子n升维。n取值1或者6,当n=1时,这个负责升维的1×1卷积是不存在的,如表1.2中Stage2所示的MBConv1模块,不需要升维。

(2)1×1卷积后面跟上k×k的深度可分离卷积(包含BN和swish),步长为1或2,k取值为3或者5。

(3)再往后是SE模块、一个标准的1×1卷积(包含BN)和一个Dropout层(只有跳连模块才包含Dropout层)。

图1.12中的跳连,仅当MBConv模块的输入与输出特征矩阵维度相同时才存在。

SE模块的工作原理参见论文Squeeze-and-excitation networks(HU J,SHEN L,SUN G,2018)。SE模块的逻辑结构如图1.13所示。

图1.13 SE模块的逻辑结构

SE模块由一个全局平均池化层GlobalAvgPooling和FC1与FC2两个全连接层组成。第一个全连接层节点个数是MBConv模块输入特征矩阵的通道数的1/4,采用swish激活函数。第二个全连接层节点个数等于深度可分离卷积层输出的特征矩阵的通道数(即乘以倍率因子后的通道数),采用sigmoid激活函数。

此处不妨回顾论文Squeeze-and-Excitation Networks(HU J,SHEN L,SUN G.2018)中关于SE的计算逻辑与应用,图1.14描述的是采用SE机制的新Inception模块的计算逻辑,图1.15描述的是采用SE机制的新ResNet模块的计算逻辑。

图1.14 采用SE机制的新Inception模块的计算逻辑

以EfficientNet-B0模型为参照,EfficientNetV1论文给出了单维度上变化与模型准确率的关系,如图1.16所示。显然,即使只对单个维度(宽度、深度、分辨率)放大,模型依然有显著改进,但是准确率达到80%左右时遇到瓶颈。

同时,EfficientNetV1论文中也给出了调整网络宽度,在不同基准模型之间的横向比较结果,如图1.17所示。这个对比实验表明,调整w,在相同的FLOPs下,dr越大,效果越好。也就是说,当网络宽度与深度、分辨率协同作用时,更容易实现理想模型。直觉看,随着分辨率的增加,往往需要网络宽度与深度同步增加,以增强对特征的深度处理能力。

图1.15 采用SE机制的新ResNet模块的计算逻辑

图1.16 模型放大单个维度的实验结果

图1.17 宽度对不同基准模型的影响

注:图1.17中的4条线代表4个基准模型(由网络深度和分辨率确定),线上的不同点代表模型的不同宽度。宽度值越大,模型准确率越高。4个不同基准模型都是如此。

总之,图1.16和图1.17的实验结果表明,在深度、宽度和分辨率三个维度上寻找一个最佳平衡点实现最优模型是可行的。论文随后给出了寻找最佳复合系数ϕ的方法,如式(1.3)所示。

αβγ是通过网格搜索得到的基准模型常量,满足式(1.3)中的约束条件。其中depth(深度)、width(宽度)、resolution(分辨率)的变化与模型浮点计算量(FLOPs)之间的关系解释如下。

(1)FLOPs与depth的关系:如果depth翻倍,则模型FLOPs也会翻倍。

(2)FLOPs与width的关系:如果width翻倍(即通道数翻倍),则模型FLOPs翻4倍。这个结论可以根据卷积层的FLOPs计算方法得到,如式(1.4)所示。

(3)FLOPs与resolution的关系:如果resolution翻倍,则模型FLOPs翻4倍。该结论也可根据式(1.4)得到。

根据式(1.3),调整ϕ,可以整体改变模型的深度、宽度和分辨率。不难看出,模型的FLOPs与(α·β2·γ2ϕ近似成正比。由于EfficientNet中约定α·β2·γ2≈2,故FLOPs与2ϕ近似成正比。

论文以EfficientNet-B0为基准参考模型,给出了模型缩放算法。

步骤1:固定ϕ=1,根据式(1.2)和式(1.3)做网格搜索,确定αβγ。在α·β2·γ2≈2约束下,论文给出的最佳值是α=1.2,β=1.1,γ=1.15。

步骤2:根据步骤1得到的结果,固定αβγ为不变的常量,根据式(1.3)只对ϕ做调整,最终得到模型EfficientNet-B1~EfficientNet-B7。

为了观察ϕ对模型的调整效果,图1.18给出了EfficientNet-B1的结构与运算逻辑。与EfficientNet-B0模型相比,变化主要体现在输入层分辨率和Stage深度的增加,网络宽度不变。

论文通过大量的实验对比,证明了模型EfficientNet-B0~EfficientNet-B7的有效性。论文最后特别指出,自2017年以来,多数模型只是针对ImageNet的验证数据集(5万个样本)发布实验结果,而EfficientNet则同时基于ImageNet的验证集和测试集(10万个样本)发布对比实验结果,如表1.3所示。该结果进一步证明了EfficientNet模型系列具备良好的泛化能力。

图1.18 EfficientNet-B1的结构与运算逻辑

表1.3 EfficientNet-B0~EfficientNet-B7在ImageNet验证集与测试集上的实验结果对比

表1.4给出了EfficientNet-B0~EfficientNet-B7的参数变化对照表。

表1.4 EfficientNet-B0~EfficientNet-B7参数变化对照表

(1)input_isize:模型输入层接受的图像分辨率。

(2)width_coefficient:模型宽度(通道)维度上的因子系数。以EfficientNet-B0的Stage1为例,3×3卷积层包含的卷积核个数是32,那么EfficientNet-B6的Stage1中卷积核个数则为32×1.8=57.6,取最接近57.6的8的整数倍的数56,作为EfficientNet-B6中Stage1的卷积核数量。

(3)depth_coefficient:Stage2~Stage8上的深度系数。以EfficientNet-B0的Stage7为例,其=4,则B6的Stage7对应的值为4×2.6=10.4,向上取整为11。

(4)drop_connect_rate:特指在MBConv结构中使用的Dropout因子,采用Stochastic Depth算法,会随机丢掉整个MBConv的主分支,只保留跳连(捷径)分支,相当于跳过一个MBConv模块,减少网络深度。

(5)dropout_rate:特指Stage9中全连接层之前的Dropout层采用的因子系数。