2.1.14 MobileNet V2/V3
(Sandler et al.,2018)发现,直接训练 MobileNet 倾向于让其中的Depthwise卷积的卷积核很多为0,由于ReLU 激活函数会将小于0 的特征直接置 0,当特征通道数比较少时,ReLU 带来的信息损失问题比较严重。因此,MobileNet V2(Sandler et al.,2018)在MobileNet的基础上引入了线性瓶颈(Linear Bottleneck)结构和倒置残差(Inverted Residual)结构,如图2-21所示。
图2-21 MobileNet V2 网络结构图
由于MobileNet V2中的Depthwise卷积不改变通道数,输出通道数和输入通道数相同,如果输入通道数比较小,Depthwise卷积的效果会受影响。因此,MobileNet V2在Depthwise卷积之前先用卷积进行升维,使得输出通道数是输入通道数的6 倍,后续的Depthwise卷积再在一个通道数更高的空间中进行特征提取,最后通过一个卷积恢复到原来的特征通道数。整体再加一个短路连接,如图2-21(a)所示;当需要空间维度减半时,由于输入和输出空间维度不一致,不使用短路连接,空间维度减半通过将 Dpethwise卷积中的步长设为2 实现,如图2-21(b)所示。
此外,MobileNet V2 第一个卷积层和Depthwise卷积层后都使用了ReLU6 激活函数,如图2-22所示,相比于标准 ReLU 激活函数的取值范围为,ReLU6 激活函数限制了输出值的上限,取值范围为,在低精度计算下具有更强的稳健性(Robustness)。MobileNet V2在第二个卷积后使用线性激活函数,即不使用激活函数,这称为线性瓶颈,可以降低 ReLU 带来的信息损失。
图2-22 ReLU和ReLU6 激活函数对比
整体上看,图2-21(a)和ResNet的带瓶颈的残差模块很相似,区别在于以下几点:
● 激活函数不同。ResNet 使用ReLU 激活函数,而 MobileNet V2 前两个卷积层后使用ReLU6 激活函数,第三个卷积层后使用线性激活函数。
● 卷积的作用不同。ResNet 先用卷积降维到输入通道数的1/4,经过卷积进行特征提取后,再用另一个卷积升维到输入通道数,而 MobileNet 先用卷积升维到输入通道数的6 倍,经过卷积特征提取后,再用另一个卷积降维到输入通道数。由于中间升降维顺序正好和ResNet的残差模块相反,因此 MobileNet中的结构称为倒置残差模块。
● 中间的卷积层不同。ResNet中间的卷积层是标准的卷积,而 MobileNet中间的卷积层是的Depthwise卷积。
MobileNet V3(Howard et al.,2019)在MobileNet V2的基础上使用了硬件感知的网络结构搜索(Network Architecture Search,NAS),并将激活函数换成了Swish(Ramachandran et al.,2018),然后提出h-swish 近似 Swish,以及加入了SE模块等(见 2.1.12 节)。
其中,Swish 激活函数的形式为
(2.10)
表示 Sigmoid 激活函数,是一个超参数,Swish 激活函数具有无上下界、光滑、非单调的特性,(Ramachandran et al.,2018)发现使用Swish 激活函数效果优于传统的ReLU 激活函数。h-swish 希望通过 ReLU6 激活函数逼近 Sigmoid 函数,这样可以降低计算量,h-swish 激活函数的形式为
(2.11)