MobileNet v2
原创: [email protected]
时间: 2020/08/10
文章目录
0x00 Paper
- Paper: MobileNet v2
- Code: mobilenet_v2.py
0x01 为了解决什么问题
设计更小更快的网络结构。
深度卷积(Depthwise Convolution) 本身不能改变特征的通道数,并且通道数越少,在进行非线性**函数的时候,会丢失更多的信息。
上图是作者展示用RELU**时,当channel越小,丢失的信息越多,当channel越大,丢失的信息越少。当channel为2时,信息都集中在这两个channel中,如果有部分数值小于0就会被RELU**丢失掉。而如果channel为30,其实信息是分散的,而且具有了冗余,所以通过RELU**后归于0的值可能并不会影响太多信息的存储。
所以作者建议对于channel数很少的那些层做线性**。当通道数由少变多的时候,用ReLU**函数,当通道数由多变少的时候,做线性**。
bottlenect就表示瓶颈层,通道数由多变少,linear bottleneck表示对channel缩减的层做线性**。虚线的tensor后进行线性**。
a是普通卷积,b是深度分离卷积,c是有bottlenect的分离卷积,d是对bottlenect进行扩张后的分离卷积。同样最后一层虚线的tensor后面是线性**。
0x02 提出了哪些创新点
2.1 两个闪闪发光的点
-
Linear Bottlenecks
对通道数较少的使用线性**,为了提取更多的特征信息
-
Inverted residual structure
a是正常的残差块,通道数先降维再升维,b是倒置的残差块,通道数先升维后降维。前者在特征提取的时候可能会丢失信息(通道数越少特征提取能力越弱),所以作者采用了后者的方法。同样,虚线tensor后面进行的是线性**。
-
h*w为输入的尺寸大小,t是扩展因子,k是卷积核大小,d’ 是输入通道,d’’ 是输出通道
2.2 MobileNet V2 与 V1 之间的相同和不同点
-
相同点
都使用了 DSCNN,降低了网络的计算参数,具体详细请看上一篇博客 ☞ MobileNet V1 复古的直筒子结构
-
不同点
MobileNet V1 使用的是
DW + PW
的直筒子结构。为什么说是直筒子呢?因为在 DW 的过程中,网络自身无法改变输入和输出的通道数,可以查看第一张图的图b,很形象了。因此如果传入的通道数较少,网络的特征提取能力就相对来说较弱。- 第一个不同点:
MobileNet V2 使用的是
PW + DW + PW
结构,先升维,拉高通道数,后降维。因此无论传入的通道数是多还是少,都强行按照系数高- 第二个不同点:
MobileNet V2 在最后
PW
之后,去掉了ReLU
**函数,也就是使用了线性的Bottleneck
。作者认为**函数在高维空间能够有效的增加非线性,而在低维空间时会破坏特征,不如线性的效果好。
2.3 ResNet 与 MobileNet V2 比对
-
相同点
-
使用了
1*1 --> 3*3 --> 1*1
的模式; -
用Shortcut 将输出和输入相加
-
-
不同点
- ResNet 使用标准卷积提取特征,而 MobileNet 使用 DW 卷积提取特征
- ResNet 先降维、卷积、再升维,MobileNet 先升维、DW、再降维
0x03 网络结构
当步长等于2的时候:
此处还有一些问题:
1. 上面的bottleneck
总共加起来只有17层,而paper 中论述有19层;
2. 还有同学跑出来的MobileNet V2 版本的推理速度比 V1 还慢,有待商榷 (代码未详读)
最终的效果比对: