MobileNetV2: Inverted Residuals and Linear Bottlenecks

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,使用3
3卷积核,步长为1,并根据g参数进行分组卷积操作。这样的设计有助于增强网络的表达能力,同时通过分组卷积减少计算量

第一个卷积层将输入通道数c1缩减到一个中间的通道数c_(通常是输出通道数c2的某个比例)。
第二个卷积层将中间通道数c_恢复到输出通道数c2,同时可以根据配置应用组卷积(group convolution)

这样我们就会形成一个类似瓶子的两头大中间细的结构,将这种结构形象的称为Bottleneck

倒残差结构

  1. 说明残差结构与倒残差结构的区别:

逆残差结构(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就是所谓的拓展因子。

  1. V2共有54层
  2. ReLU6就是普通的ReLU但是限制最大输出值为6,这是为了在移动端设备也能有很好的数值分辨率

V2的网络结构

论文中针对v2模型给出了其网络结构图示:

  • t是扩展因子
  • c是输出特征矩阵深度channel
  • n是bottleneck的重复次数
  • s是步距(针对第一层,其他为1)
相关推荐
苏言の狗2 小时前
Pytorch中关于Tensor的操作
人工智能·pytorch·python·深度学习·机器学习
paixiaoxin4 小时前
CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究
人工智能·深度学习·机器学习·生成对抗网络·计算机视觉·ocr·.net
weixin_515202494 小时前
第R3周:RNN-心脏病预测
人工智能·rnn·深度学习
吕小明么6 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
CSBLOG7 小时前
深度学习试题及答案解析(一)
人工智能·深度学习
小陈phd7 小时前
深度学习之超分辨率算法——SRCNN
python·深度学习·tensorflow·卷积
王国强20098 小时前
动手学人工智能-深度学习计算5-文件读写操作
深度学习
威化饼的一隅9 小时前
【多模态】swift-3框架使用
人工智能·深度学习·大模型·swift·多模态
机器学习之心9 小时前
BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)
深度学习·分类·gru
MorleyOlsen11 小时前
【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
运维·服务器·深度学习