轻量化网络Mobilenetv1-v3,Resnext,shufflenetv1-v2,Inceptionv1-v4演变过程总结

目录

一、mobilenet系列

1、mobilenet-v1

2、mobilenet-v2

3、mobilenet-v3

二、Resnext

三、shufflenet系列

1、shufflenet-v1

2、shufflenet-v2

四、Inception

1、Inception-v1

2、Inception-v2

3、Inception-v3

4、Inception-v4


一、mobilenet系列

1、mobilenet-v1

 mobilenetv1其实就是把卷积过程进行分解,对于标准卷积来说,假如输入为Dk*D*k*M,输出为Dk*D*k*N,则需要N个通道数为M的Dk*Dk的卷积核。

而mobilenet则是先用M个通道数为1的Dk*Dk的卷积核,每个卷积核都是单层,分别作用于输入的每个通道。接着再用N个通道数为M的1*1的卷积核进行卷积。(图画得比较丑。大家有什么好的画图软件可以推荐一下~)

2、mobilenet-v2

而mobilenetv2实际上是参考了Resnet的shortcut思想。加入了残差连接。

在v1的基础上先加入了1*1的卷积进行通道数调整。但是它和Resnet不同,resnet是先对通道数进行压缩,再提取特征然后再扩张成原来的通道数。

而mobilenetv2是先对通道数进行扩张,然后用DW卷积特征提取,最后进行通道数压缩为原来的通道数与输入保持一致。同时将v1后面的Relu激活函数变为了linear线性激活,因为通道数最后进行了压缩,本身已经对特征有损失,再进行非线性激活的话,特征信息会损失更多。

3、mobilenet-v3

 

 v3在v2的基础上主要是加入了SE注意力机制,下面那张图中下面画圈的部分就是SE模块的简单实现。更具体的如下图所示。就是将特征图每个通道进行平均池化,那么就会得到一个向量,这时候通过一个全连接层将通道式调整为原来的1/4,并通过Relu激活,再经过一个全连接层和Hard-sigmoid激活函数(有兴趣的自己去了解一下),将通道数还原,我们就得到每个通道的一个权重,和原来的特征图乘以权重,就简单实现了SE模块。

 (还有就是重新设计了激活函数,有兴趣的了解一下swish激活函数,以及hard-sigmoid,hard-swish)

二、Resnext

在原来的residual block中,引入了分组卷积。将输入特征分成g组,同样的卷积核也分成g组,每组卷积核对应的特征group进行卷积计算,最后得到的特征进行相加。参数量变为原来的1/g。

 

 

三、shufflenet系列

1、shufflenet-v1

shufflenet其实就是对resnext的一个改进,resnext的组卷积,会导致不同组卷积得到的特征之间割裂开来,得到的信息之间没有交流,效果自然也就不好。因此引入了channel shuffle的思想,对第一次组卷积得到的中间特征层,每组特征再进行分组,然后将每组中取一部分特征作为一个新的组进行接下来的卷积计算,相当于各个组间的特征信息得到了融合交流。

 如下图所示的b就是stride=1的shufflenetv1,图c是stride=2的情况。

 

2、shufflenet-v2

(c)和(d)是v2版本。

在v1的基础上,主要有几点变化。(其原论文中提出了四个设计高效网络的准则,有兴趣的可以去看原论文了解。)

stride=1的情况。

首先是输入端,对输入特征层进行了一个切分,因此输出端不再用add,而是将两部分特征进行concat操作以保证通道数不变。

其次是将ReLu从add之后放到了右边分支的最后,也就是只对右边的特征进行非线性激活,而不是对两个分支都进行非线性激活。

然后是把1*1的组卷积换回了普通卷积,那也就 不需要channel shuffle操作了,所以将channel shuffle放到concat之后。

stride=2的情况。和stride=1一样。不同的是没有进行channel spilt操作,那么concat之后的通道数会翻倍。其次将左边原来的步长为2 的3*3平均池化换成了步长为2的3*3组卷积核一个1*1卷积串联以保证每个分支的输入输出通道一致。

 

四、Inception

1、Inception-v1

以在GoogLeNet之前的网络中,一层一般只使用一种操作(单个卷积或池化),一层只使用一个操作的弊端是提取出来的特征往往过于单调。在实际情况中,由于图像的不同尺度等原因,需要不同程度的下采样,或者说不同大小的卷积核,我们希望网络代替人手工自己决定到底使用1 * 1 ,3*3,5*5以及是否需要max_pooling层,由网络自动去寻找适合的结构。并且节省计算提取更为丰富的特征,Inception结构正好满足了这样的需求,因而获得了更好的表现。

但所有的卷积核都在上一层的所有输出上来做,5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构。

 

2、Inception-v2

v2中主要是对卷积核进行分解,论文认为两个3*3的卷积可以代替一个5*5的卷积,三个3*3的卷积可以代替一个7*7的卷积。

 

 这样的连接方式在保持感受野范围的同时又减少了参数量,并且可以避免表达瓶颈,加深非线性表达能力。

3、Inception-v3

 既然卷积分解可以减少参数量又能保持感受野,那么能不能再进行更进一步的分解呢?所以又提出了非对称卷积分解,也就是任意n*n的卷积都可以分解成一个1*n卷积核和一个n*1卷积。

 

 但是发现这种结构对于网络前期的效果不好,但是在中等大小的特征层使用效果比较好。(12-20的尺寸)。

因此在完整的Inceptionv3模型的结构中,如下图所示(图来自《深入浅出pytorch》)

 在前半部分采用了3个InceptionA模块,一个InceptionB模块,后面用的是3个InceptionC模块,一个InceptionD,以及两个InceptionE。

InceptionA

InceptionB(用于降采样,feature2对于feature1从宽度高度以及维度上都变为原来一半。)

 InceptionC(实际上在网络后面就用到了采用非对称分解卷积的模块。)

 InceptionD和InceptionB类似,只是把一个3*3的卷积替换为一个1*7卷积和一个7*1卷积。

 

 InceptionE ,主要是将非对称卷积分解进行并联,这样可以更好地分离特征,并且加快训练速度。

4、Inception-v4

加入了残差连接。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值