论文题目:MobileNet V2:Inverted Residuals and Linear Bottlenecks
文献地址:https://arxiv.org/abs/1801.04381
(非官方)源码地址:
(1)Caffe 实现:https://github.com/shicai/MobileNet-Caffe
(2)Pytorch实现:https://github.com/tonylins/pytorch-mobilenet-v2
(3)TensorFlow实现:https://github.com/neuleaf/MobileNetV2
MobileNet V1优劣
MobileNet V1中虽然提出了很有价值的Depthwise Convolution的卷积方式,极大程度上减少了参数量和计算量。但其网络结构却采用非常复古式的直筒结构,网络结构性价比不高。并且由于每一次卷积的维度都很小,卷积后的结果再经过ReLU激活函数,很容易获得0值,丧失有价值的信息。
MobileNet V2思想与结构
因此,MobileNet V2 的版本中引入了两个改动:Inverted Residuals and Linear Bottlenecks
一方面,为模型添加了潮流的结构,(潮流的结构使用的是扩张-特征提取-压缩的方式,Inverted Residuals)由于卷积操作采用的DW操作,先对通道数量进行扩张并不会增加多少参数量和计算量。【输入和输出的通道数量均为低维度的张量】
另一方面,去掉了ReLU激活函数,使用线性的结构以防止该层毁灭一些有用的信息,以防止深度卷积训出来的卷积核不少为空的现象。
整理一下: MobileNet v2 依旧使用depthwise separable convolutions操作,但主体结构变为如下右图的形式:
主体结构的block包含了3个卷积层,最后两个卷积层是在MobileNet V1中提到的结构:一个DW (depthwise convolution),一个PW (pointwise convolution) 。然而,此时的1*1的PW操作与MobileNet稍有不同。
- 在V1中,PW卷积用于保持通道数量相同或者2倍于之前的通道数量。 【扩大】
- 在V2中,PW卷积操作用于降低通道数量。 :它将维数高的数据(通道)投射到维数低得多的张量中。 【压缩】
In V1 the pointwise convolution either kept the number of channels the same or doubled them. In V2 it does the opposite: it makes the number of channels smaller.
第一个卷积层是一个新增的层,其依旧是1*1卷积的PW操作。其主要目的是扩大通道数量。将通道数量扩大后的feature map 传递给DW进行depthwise convolutions。扩充数量通过扩张因子t决定。【扩张】
也就是说,其内部是一个 扩张-特征提取-压缩的过程。如下图可以看出网络结构详细的变化(扩张因子factor的作用):
从上图可以看出,通过这样的结构,输入和输出都是低维度的张量;在块内进行DW操作的是一个高维度的张量。由于此时的卷积操作是DW的操作,即使是高维度的张量,也不会增加多少参数和计算量。
另一方面, 增添了residual connection 的连接,为MobileNet V1中直筒的结构增添了ResNet作用的结构。
另外,除了projection convolution 层的输出结构没有激活函数ReLU6,其余的各层都会添加BN结构和ReLU6的结构。
Expansion layer充当解压器(如解压缩),它首先将数据恢复到其完整的形式,然后Depthwise layer执行在网络的这个阶段中任何重要的过滤,最后Projection layer压缩数据使其再次变小。
作者为什么要将DW操作的张量维度提升呢?这么做有什么用意呢?
当n = 2,3时(n为通道数量),与Input相比有很大一部分的信息已经丢失了。而当n = 15到30,还是有相当多的地方被保留了下来。也就是说,对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。
- Inverted Residuals:
从上图中可以看出,Inverted Residuals与Residual Net不同在于:
- ResNet (V1) 中采用1*1卷积、3*3卷积、1*1卷积的组合方式进行"压缩"-"特征提取"-"扩张"的方式。即先将通道数量减少,再进行3*3卷积,最后通过1*1卷积还原输入的通道数量。
- Inverted Residuals 中由于采用Depth-wise convolutions的操作,进行"扩张"-"特征提取"-"压缩"的方式。正好与上述ResNet的方式相反,所以称之为Inverted Residuals。
2. Linear Bottleneck:
为了解决MobileNet V1中,由于DW操作只针对一个通道,维度较低,feature map经ReLU激活后极易造成输出的值大多全为0,造成卷积核训练无效。
从上图中可以看出,MobileNet V1 版本和V2版本的区别,即在最终PW的输出后使用Linear代替了ReLU6的激活函数。(ReLU激活函数的非零部分实际上也就是线性激活函数)
MobileNet 的网络结构(修改后的网络结构):
结构图源自:https://pytorch.org/hub/pytorch_vision_mobilenet_v2/
针对stride=1 和stride=2,在block上有稍微不同,主要是为了与shortcut的维度匹配,因此,stride=2时,不采用shortcut。 具体如下图:
原文地址:https://www.cnblogs.com/monologuesmw/p/12272010.html