MobileNetV2---倒残差结构的线性瓶颈层
MobileNet v2网络是由google团队在2018年提出的,相比MobileNetV1网络,准确率更高,模型更小。
首先再次对Bottleneck模块进行简单的介绍与说明。
这是一个Standard bottleneck,这种bottleneck结构在深度神经网络中广泛使用,特别是在卷积神经网络中,它可以有效减少参数数量,降低运算复杂度,同时尽可能保持网络性能
python
class Bottleneck(nn.Module):
#
def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion
super(Bottleneck, self).__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_, c2, 3, 1, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
c_,计算中间层的通道数,这样做可以在不大幅增加计算量的前提下增加网络的宽度
cv1,定义第1个卷积模块,卷积核为11,步长为1
cv2,定义第2个卷积模块,将通道数返回至c2,使用33卷积核,步长为1,并根据g参数进行分组卷积操作。这样的设计有助于增强网络的表达能力,同时通过分组卷积减少计算量
第一个卷积层将输入通道数c1缩减到一个中间的通道数c_(通常是输出通道数c2的某个比例)。
第二个卷积层将中间通道数c_恢复到输出通道数c2,同时可以根据配置应用组卷积(group convolution)
这样我们就会形成一个类似瓶子的两头大中间细的结构,将这种结构形象的称为Bottleneck
倒残差结构
- 说明残差结构与倒残差结构的区别:
逆残差结构(lnyerted residuals):在ResNet中,为了构建更深的网络,提出了ResNet的另一种形式,bottleneck,结构如下所示,一个bottleneck由一个1x1卷积(降维),3x3卷积和1x1卷积(升维)构成。在MobileNet中,DepthwiseConv卷积的层数是输入通道数,本身就比较少,如果跟残差网络中的bottleneck一样,先压缩,后卷积提取,可得到的特征就太少了。采取了一种逆向的方法,先升维,卷积,再降维。
本来的通道数就比较少,如果在进行降维的话就会保存更少的信息了
通过这个图我们可以很明显的看出残差模块的主要的操作是通过:
- 1x1 卷积降维
- 3x3卷积
- 1x1 卷积升维
所形成的两头大中间小的结构
而第二幅图可以看出倒残差结构正好就是一个相反的过程,它的操作主要是通过:
- 1x1 卷积升维
- 3x3卷积DW
- 1x1卷积降维
所形成的两头小中间大的结构
这个图的区别还要一个地方就在于倒残差的结构使用的激活函数是Relu6的激活函数,而普通的残差结构使用的是Relu激活函数。
激活函数
Relu激活函数:
ReLU ( x ) = max ( x , 0 ) \operatorname{ReLU}(x)=\max (x, 0) ReLU(x)=max(x,0)
Relu6激活函数的表达式子
y = ReLU 6 ( x ) = min ( max ( x , 0 ) , 6 ) y=\operatorname{ReLU} 6(x)=\min (\max (x, 0), 6) y=ReLU6(x)=min(max(x,0),6)
超过6的值置为6即可
Linear Bottlenecks
线性瓶颈层(Linear Bottleneck):在高维空间上,诸如ReLU这种激活函数能有效增加特征的非线性表达,但是仅限于在高维空间中,如果维度降低,到了低维空间,再加入ReLU则会破坏特征。
在MobileNetsv2中提出了Linear Bottlenecks结构,也就是在执行了降维的卷积层后面,不再加入类似ReLU等的激活函数进行非线性转化,这样做的目的也是尽可能的不造成信息丢失。
针对这个问题作者在论文中也给出了做过的一个实验如下所示:
随着维度的上升,直到15维左右,才会保留一定的信息和原来的信息保持基本的一致性。
ReLU激活函数对低维特征信息造成大量损失
V2的改进工作
线性瓶颈层
也就是在深度可分离卷积的最后一层pw卷积那里,将激活函数去掉而是使用线性层来进行是实现。
具体的改进细节:
- 均采用PW(Point-wise)+DW(Depth-wise)的卷积方式提取特征
- V2版本在DW卷积之前新加入一个PW卷积,能动态改变特征通道(DW卷积没有改变通达数的能力,如果给的通道数过少会产生问题)
给的信息太少的话也没法把特征提取出来
- V2去掉了第二个PW的激活函数,最大程度保留有效特征
倒残差结构
改进的地方在于参考了RestNet这一网络的结构并进行了一定的改进。
- 借鉴ResNet,都采用了1x1->3x3->1x1的模式
- 借鉴ResNet,同样使用Shortcut短路连接将输出与输入相加
- ResNet利用标准卷积提取特征,V2利用深度卷积(DW)提取特征
- ResNet先降维:卷积、再升维,而V2则是先升维、卷积,再降维
从沙漏型到纺锤型的结构
论文中给出了这种倒残差结构的简单模型结构图示。
当stride=1且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接
其中t就是所谓的拓展因子。
- V2共有54层
- ReLU6就是普通的ReLU但是限制最大输出值为6,这是为了在移动端设备也能有很好的数值分辨率
V2的网络结构
论文中针对v2模型给出了其网络结构图示:
- t是扩展因子
- c是输出特征矩阵深度channel
- n是bottleneck的重复次数
- s是步距(针对第一层,其他为1)