当前位置: 代码迷 >> 综合 >> 【轻量级网络】MobileNet-v2详解
  详细解决方案

【轻量级网络】MobileNet-v2详解

热度:73   发布时间:2023-12-14 04:01:39.0

论文:《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation》
论文链接:https://arxiv.org/abs/1801.04381
前文链接:MobileNet-v1详解

概述

       MobileNet-v2的主要思想就是在v1的基础上引入了线性瓶颈 (Linear Bottleneck)和逆残差 (Inverted Residual)来提高网络的表征能力,同样也是一种轻量级的卷积神经网络。MobileNet-v1的主要思想就是深度可分离卷积,如果对这个方面不太了解的话,可以参考我的另一篇文章,链接已放在文章开头。

1. MobileNet-v1存在的问题

       结构问题:MobileNet-v1的结构非常简单,类似于VGGNet,是一个非常复古的直筒结构。这种结构的性价比其实不高,后续一系列的ResNet、DenseNet等结构已经证明通过复用图像特征,使用Concat/Elwise+等操作进行融合,能极大提升网络的性价比。
       Depthwise convolution存在的问题:Depthwise convolution确实是大大降低了计算量,Depthwise+Pointwise的结构在性能上也能接近普通卷积。但是在实际应用时我们发现Depthwsie部分的kernel比较容易训废掉,训练完之后发现Depthwise训出来的kernel有不少是空的。因为depthwise每个kernel_dim相对于普通卷积要小得多,过小的kernel_dim加上ReLU的激活影响下,使得输出神经元很容易变为0,所以就学废了。ReLU对于0的输出梯度为0,所以一旦陷入0输出,就没法恢复了。

2. Inverted Residual(逆残差)

原始Residual block和Inverted residual block对比
                                                                   原始Residual block和Inverted residual block对比

(a)Original residual block:reduce – transfer – expand (中间窄两头宽)
       Residual block先用1x1卷积降通道过ReLU,再3x3卷积过ReLU,最后再用1x1卷积过ReLU恢复通道,并和输入相加。之所以要1*1卷积降通道,是为了减少计算量,不然中间的3x3卷积计算量太大。所以Residual block是中间窄两头宽。
(b)Inverted residual block:expand – transfer – reduce (中间宽两头窄)
       在Inverted Residual block中,3x3卷积变成Depthwise了,计算量很少了,所以通道数可以多一点,效果更好,所以通过1x1卷积先提升通道数,再Depthwise3x3卷积,最后用1x1卷积降低通道数。两端的通道数都很小,所以1x1卷积升通道和降通道计算量都并不大,而中间的通道数虽然多,但是Depthwise 的卷积计算量也不大。下图即为具体实例:

在这里插入图片描述

– 为什么要使用Inverted residual

       skip connection这种bottleneck的结构被证明很有效,所以想用。但是如果像以前那样先压缩channal,channal数本来就少,再压没了,所以不如先增大后减少。

3. Linear Bottleneck(线性瓶颈层)

Original bottlenecks:Elwise + with ReLU at end of a bottleneck
Linear bottlenecks:Elwise + with NO ReLU at the end of a bottleneck

       论文中对这块的描述比较晦涩难懂,其实大致意思就是:我们在设计网络结构的时候,想要减少运算量,就需要尽可能将网络维度设计的低一些,但是维度如果低的话,ReLU激活函数可能会滤除很多有用信息。而ReLU对于没有滤除的部分,即非零的部分的作用是一个线性分类器。既然在低维空间中使用ReLU做激活变换会丢失很多信息,论文针对这个问题在Bottleneck末尾使用linear bottleneck(即不使用ReLU激活,做了线性变换)来代替原本的非线性激活变换。
       实验证明,使用linear bottleneck可以防止非线性破坏太多信息。

– 为什么要使用Linear Bottleneck

       ReLU让负半轴为0。本来参数就不多,学习能力就有限,这一下再让一些参数为0了,就更学不着什么东西了,干脆在elwise+那里不要ReLU了。

4. Inverted Residual + Linear Bottleneck

       结构如下图所示。在MobileNet-v2的网络设计中,除了继续使用Depthwise Conv(Bottleneck中间的卷积层)结构之外,还使用了Expansion layer和 Projection layer。Expansion layer是使用1x1卷积将低维空间映射到高维空间(扩大通道数),这里Expansion有一个超参数是维度扩展几倍,可以根据实际情况来做调整的,默认值是6,也就是扩展6倍。Projection layer也是使用1x1卷积,他的目的是希望把高维特征映射到低维空间去(减小通道数)。需要注意的是residual connection是在输入和输出的部分进行连接。另外,前面已经说过,因为从高维向低维转换,使用ReLU激活函数可能会造成信息丢失或破坏,所以在Projection convolution这一部分,我们不再使用ReLU激活函数而是使用线性激活函数。
在这里插入图片描述

5. MobileNet-v2整体网络结构

       MobileNetV2的模型如下图所示,其中t为Bottleneck内部升维的倍数,c为通道数,n为该bottleneck重复的次数,s为sride。
在这里插入图片描述
       其中,当stride=1时,才会使用elementwise 的sum将输入和输出特征连接(如下图左侧);stride=2时,无short cut连接输入和输出特征(下图右侧)。
在这里插入图片描述
● 需要注意的是:
       1)当n>1时(即该瓶颈层重复的次数>1),只在第一个瓶颈层stride为对应的s,其他重复的瓶颈层stride均为1;
       2)只在stride=1时,输出特征尺寸和输入特征尺寸一致,才会使用elementwise sum将输出与输入相加;
       3)当n>1时,只在第一个瓶颈层升维,其他时候channel不变。(针对整个瓶颈层的维度)

       (例如,对于该图中56x56x24的那层,共有3个该瓶颈层,只在第一个瓶颈层使用stride=2,后两个瓶颈层stride=1;第一个瓶颈层由于输入和输出尺寸不一致,因而无short cut连接,后两个由于stride=1,输入输出特征尺寸一致,会使用short cut将输入和输出特征进行elementwise的sum;另外,只在第一个瓶颈层最后的1x1conv对特征进行升维,后两个瓶颈层输出维度不变(不要和瓶颈层内部的升维弄混了)。该层输入特征为56x56x24,第一个瓶颈层输出为28x28x32(特征尺寸降低,特征维度增加,无short cut),第二个、第三个瓶颈层输入和输出均为28x28x32(此时c=32,s=1,有short cut)。)
       另外表中还有一个k。mobileNet-v1中提出了宽度缩放因子,其作用是在整体上对网络的每一层维度(特征数量)进行瘦身。在MobileNetV2中,当k<1时,最后的1*1conv不进行宽度缩放,否则进行宽度缩放。
       
       
       
       

关于ReLU6:
       卷积之后通常会接一个 ReLU 非线性激活,在 MobileNet 中使用 ReLU6。ReLU6 就是普 通的 ReLU 但是限制最大输出为 6,这是为了在移动端设备 float16/int8 的低精度的时候也能 有很好的数值分辨率。如果对 ReLU 的激活范围不加限制,输出范围为 0 到正无穷,如果激 活值非常大,分布在一个很大的范围内,则低精度的 float16/int8 无法很好地精确描述如此 大范围的数值,带来精度损失。