原文链接:https://blog.csdn.net/weixin_45377629/article/details/124430796
总而言之就是调整分辨率、深度和宽度的综合关系来提高网络水平。
1 从三个问题出发
对于一个网络,输入图像分辨越高越好?
设计网络时,越深越好?
设计网络时,越宽越好?
回答: 总体而言,是的。
图像分辨率越高,网络能得到 潜在的 更高细粒度的特征channel。但有瓶颈,且会增加计算量,分辨率太高,得不偿失。
网络越深,学习到的特征越丰富、复杂。但太深容易造成梯度消失,导致训练困难。
网络越宽,网络能得到更高粒度的特征,且容易训练。但光宽不深的话,学习不到深层次的特征,且要综合衡量计算量的问题。
EfficientNet闪亮登场。
EfficientNet利用NAS(Neural Architecture Search)搜索技术,将输入分辨率,网络的深度、宽度三者同时考虑,搭建更nice的网络结构。
2 MBConv结构解析
网络中在堆叠MBConv结构(类似于Mobilenetv3中的block),那MBConv结构长什么样?
如下图所示(文中图片感谢太阳花的小绿豆 ):
MBConv结构主要包括:
一个 1x1 的普通卷积(升维作用,包含BN和Swish激活)
一个 kxk 的Depthwise Conv卷积(包含BN和Swish激活),kxk 有3x3和5x5两种情况
一个SE模块
一个 1x1 的普通卷积(降维作用,包含BN和线性激活,线性激活y=x)
一个Droupout层
搭建过程中还需要注意几点:
第一个1x1卷积层,是用来升维的,过滤器个数是输入特征矩阵channel的n倍,n ∈ { 1 , 6 } 。
当n = 1时,不要第一个升维的1x1卷积层,这和MobileNetV3网络类似。
关于shortcut短连接,仅当输入MBConv结构的特征矩阵与输出的特征矩阵shape相同(尺寸、个数)时才存在(代码中可通过stride==1 and inputc_channels==output_channels条件来判断)。
SE模块,由一个全局平均池化,两个全连接层组成。下方给出MobileNetv3中的SE模块 示意图,在此要注意区分两点:
第一个全连接层的节点个数是输入该MBConv特征矩阵channels的 1 4 \frac{1}{4}
4
1
,且使用Swish激活函数。
第二个全连接层的节点个数等于Depthwise Conv层输出的特征矩阵channels,且使用Sigmoid激活函数。
Dropout层 的dropout_rate对应的是drop_connect_rate,和全连接层对应的dropout要区分开(注意,在源码实现中只有使用shortcut且drop_rate大于0 的时候才有Dropout层,至于为什么可以参考第四节的解释)。
3 网络详细结构
EfficientNet作者给了8个网络,下文以以EfficientNet-B0为例进行介绍,因为EfficientNet-B1~B7是在EfficientNet-B0的基础上,利用NAS搜索技术,对输入分辨率Resolution、网络深度Layers、网络宽度Channels三者进行综合调整。
EfficientNet-B0的网络框架,总体看,分成了9个Stage:
Stage1 是一个卷积核大小为3x3,步距为2的普通卷积层(包含BN和激活函数Swish)
Stage2~Stage8 是在重复堆叠 MBConv 结构
Stage9 是一个普通的1x1的卷积层(包含BN和激活函数Swish) + 一个平均池化层 + 一个全连接层组成
表格中每个参数解析:
表格中每个MBConv后会跟一个数字1或6,这里的1或6是倍率因子n (channels变胖倍数),即MBConv中第一个1x1的卷积层会将输入特征矩阵的channels扩充为n倍。
表格中k3x3或k5x5 表示MBConv中Depthwise Conv所采用的卷积核大小。
Resolution表示该Stage的输入channel尺寸。
Channels表示通过该Stage后输出特征矩阵的Channels。
Layers表示该Stage重复MBConv结构多少次
stride表示步长,重复多次的Layers,只针对第一个有效(stride=2,Resolution长宽 变为原来一半),其余均为1。
4 EfficientNet-B0~B7结构解读
EfficientNet-B0~B7结构区别如下:
表格中每个参数解析:
input_size 代表网络训练时输入图像大小
width_coefficient 代表channel维度上的倍率因子,比如在 EfficientNetB0中Stage1的3x3卷积层所使用的卷积核个数是32,那么在B6中就是32 × 1.8 = 57.6,接着取整到离它最近的8的整数倍即56,其它Stage同理。
depth_coefficient 代表depth维度上的倍率因子(仅针对Stage2到Stage8),比如在EfficientNetB0中Stage7中的MBConv6重复了4次,也就是的Layers=4,那么在B6中就是4 × 2.6 = 10.4 4 × 2.6=10.44×2.6=10.4,接着向上取整即11。
drop_connect_rate 是在MBConv结构中dropout层使用的drop_rate,MBConv结构的drop_rate是从0递增到drop_connect_rate的 (在源码实现中只有使用shortcut且drop_rate大于0的时候才有Dropout层)。
在MBConv中的Dropout层 表示随机丢掉整个block的主分支,只剩shortcut短分支,相当于直接跳过了这个block(可以理解为减少了网络的深度)。
dropout_rate是最后一个全连接层前的dropout层(在stage9的Pooling与FC之间)的dropout_rate。