MobileNet v1标准模型
MobileNet的主要工作是用depthwise sparable convolutions(深度级可分离卷积)替代过去的standard convolutions(标准卷积)来解决卷积网络的计算效率和参数量的问题。
MobileNets模型基于是depthwise sparable convolutions(深度级可分离卷积),它可以将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核)。
深度卷积将每个卷积核应用到每一个通道,而1 × 1卷积用来组合通道卷积的输出。
网络结构:
如上图所示,
- 首先是一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2(步长)进行down sampling(下采样)。
- 然后采用average pooling(平均池化)将feature变成1x1,根据预测类别大小加上全连接层.
- 最后是一个softmax层。如果单独计算depthwise convolution和pointwise convolution,整个网络有28层(这里Avg Pool和Softmax不计算在内)。
创新点:
1.放弃pooling直接采用stride = 2进行卷积运算
2.depthwise separable convolutions
它将standard convolutions(标准卷积)分解为depthwise convolution(深度卷积)和pointwise convolution(逐点卷积),它默认一种假设,使用分解后的卷积效果和标准卷积效果是近似的。
Standard convolutional与Depthwise Separeble convolutions网络结构对比:
举个栗子:
假设我们有一个输入图片
- 这个输入图片的维度是11 x 11 x 3
- 标准卷积为3 x 3 x 3 x 6(假设stride为2,padding为1)
- 那么可以得到输出为6 × 6 × 6(6 = (11-3+2*1)/2+1)的输出结果
现在输入图片不变
- 先通过一个维度是3 × 3 × 1 × 3的深度卷积(输入是3通道,这里有3个卷积核分别作用在3个通道上),得到6 × 6 × 3的中间输出,
- 然后再通过一个维度是1 × 1 × 3 ×6的1 ×1卷积,同样得到输出为6 × 6 × 6。
depthwise separable convolution在计算量上与标准卷积的差别:
假定输入特征图大小是:
输出特征图大小是:
DF是特征图的width和height,这是假定两者是相同的。对于标准的卷积:
标准的卷积计算量将是:
而对于depthwise convolution计算量为:
而对于pointwise convolution计算量是:
1x1x
所以depthwise separable convolution总计算量是:
可以比较depthwise separable convolution和标准卷积如下:
一般情况下 N 比较大,那么如果采用3x3卷积核的话,depthwise separable convolution相较标准卷积可以降低大约9倍的计算量。
MoblieNets瘦身
有时候你需要更小的模型,那么就要对MobileNet瘦身了。
这里引入了两个超参数:width multiplier(宽度乘数)和 resolution multiplier(分辨率乘数)。
宽度乘数:
第一个参数width multiplier主要是按比例减少通道数,改变参数量,该参数记为α,其取值范围为(0,1],那么输入与输出通道数将变成αM和αN,对于depthwise separable convolution,其计算量变为:
分辨率乘数:
第二个超参数是分辨率乘数 ρ ,比如原来输入特征图是224x224,可以减少为192x192。分辨率乘数用来改变输入数据层的分辨率,同样也能减少参数。在 α 和 ρ 共同作用下,MobileNets某一层的计算量为:
resolution multiplier仅仅影响计算量,但是不改变参数量。其中,ρ 是隐式参数,ρ 如果为{1,6/7,5/7,4/7},则对应输入分辨率为{224,192,160,128}
MobileNet v2
《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation》
与mobilenetV1 不同点:
1.引入了shortcut结构(残差网络)
2.在Depth-wise convolution之前多了一个1*1的“扩张”卷积层,目的是为了提升通道数,获得更多特征。(Inverted Residuals)
- 一般的的residuals block是先经过一个1*1的Conv layer,feature map降维,再经过3*3 Conv layer,最后经过一个1*1 的Conv layer,将feature map升维回去。
- 而 inverted residuals就是 先“扩张”,最后“压缩”。
3.pointwise结束之后弃用relu激活函数,改用linear激活函数,来防止relu对特征的破坏。(Linear Bottlenecks)
- 公式:
- relu6一般在低精度运算中使用,在移动端设备中很受欢迎。和relu相比,relu6的输出被限制在了一个固定区间内。
综上:
网络结构:
参考:https://cuijiahua.com/blog/2018/02/dl_6.html & https://zhuanlan.zhihu.com/p/33075914