mobilenetv2深度解析

今天下午仔细review了mobilenetv2的论文,有了新的感觉,在这里留个记录,也跟大家分享一下。论文原文《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

论文里面提出了下面几个结构,深度卷积就不说了,正常卷积可以分解为depthwise和pointwise两个卷积,减小运算量和参数数量。如下面,a是正常的卷积形式,b是深度卷积,c是引入了linear bottleneck(bottlenect 指的就是瓶颈,网络中通道数很小的那一层),d是bottleneck后面引入膨胀层。那么,做么做深层次的原因纠结是什么呢?

mobilenetv2深度解析_第1张图片

1 Linear Bottlenecks

 

论文里面做了这么一个实验,如下图,输入是一个二维的圆形数据,经过线性变换乘Tx,维数变成n,再经过relu,再T‘x变回来,第二到最后是得到的图,可以看见,n=2和n=3,数据有比较大的损失,n越大,损失越少。这说明了什么?图像经过正常的卷积+relu不就是这种形式,如果输入维度2,conv+relu出来维度100,这100维真的是有必要吗,我可不可以再线性变换一下转到2维呢?这样信息也没有怎么丢失,因此我们在后面接入一个bottlenecks,来捕获这种真实的维度。这种捕获是一个线性变换,因此到bottenecks层的前面不要加relu,这种非线性激活或造成精度下降。(图画的有点问题,参考代码验证)

普遍意义上来说,非线性激活单元会造成信息的丢失,要缓解这种丢失,非线性单元输入维度应尽可能的高。

mobilenetv2深度解析_第2张图片

2 Inverted residuals

反转残差单元,正常的残差单元如a,将输入收缩,再卷积,再膨胀,而反转残差是将输入扩张,再卷积,再收缩。灵感其实和上面是一样的,不能在bottleneck层直接卷积非线性,这样会造成信息损失,先将他维度扩张,再卷积非线性,此次有用信息只是位于输出的子空间里,再收缩,shortcut直接连接两个bottleneck层就好了。切记第二个bottleneck前面不用非线性单元,否者就没用了。(图画的有点问题)


mobilenetv2深度解析_第3张图片

3网络结构

这个没什么好说的了,参考实现就好了。

mobilenetv2深度解析_第4张图片

结构块如下,最后一个conv1*1出来是linear,没有接非线性单元,即到第二个botlleneck层是线性变换。

mobilenetv2深度解析_第5张图片

 

你可能感兴趣的:(深度学习)