mobileNet v2和v1一样面向的是算力有限的mobile models.
主要贡献是一个新型module:
这里面提到了两个关键结构:inverted residual, linear bottleneck,
而linear bottleneck是用在inverted residule里面的。
关于linear bottleneck,有一个故事线,
故事讲了non-linear存在的问题,为什么要用linear,以ReLU为例。
下面就来讲讲这个故事:
首先给了一个前提假设,nerual network的兴趣区域特征应该能被嵌入一个低维的空间,
比如一个很深的卷积层,它里面的特征应该能被嵌入某个低维空间。
然而如果减少层数到低维,又会遇到non-linear映射的问题,比如ReLU,
回忆一下ReLU结构
那ReLU有什么问题呢,你会发现它只能映射右半边,而损失掉左半边。
特征经过它的映射会变成分段的线。
为了证明这一点(ReLU确实有信息损失),作者用一个spiral做了实验,
先用随机的矩阵T把spiral映射到n维空间,经过ReLU后再用T-1映射回来,
当维度n比较小时(2,3), 确实会损失,而维度高时会好一些。
所以说如果input的有很多channels, 那么就有可能信息得到保留,
因此得到2个性质:
又是low-dimensional, 又是higher-dimensional,很绕口有木有,
其实是想说,兴趣区域的信息会嵌入到低维的空间中,但是在activation时需要一个高维的输入。
第1条说明了什么呢,
如果信息保留下来,那肯定是经过ReLU的右半边,右半边是线性的,所以为线性layer打下了基础。
ReLU能保留兴趣区域的信息,前提是信息在低维子空间。
所以这个故事得到了一个结论,
假设兴趣区域的信息就在低维子空间,
那么可以插入linear bottleneck来得到它。
因为linear layer不会造成信息的损失,然后non-linear再bottleneck结构中确实会影响performance.
你肯定想说为什么是linear bottleneck而不是linear 其他的,
mobileNet v2提出的就是改进版的bottleneck结构。
mobileNet v2中的bottleneck, 它的名字叫做
透露了几个点:
bottleneck里面沿用了mobileNet v1的深度可分离卷积,还有residuals
具体如下
第一层是expansion,增加channel到t倍的,t 默认是6
然后是3x3深度卷积,再配上1x1卷积调整output channel。
对比一下resNet中的 bottleneck,
具体的参考链接
你会发现resNet的bottleneck,channel是在bottleneck结尾处扩张的,
而mobileNet v2中,channel是在bottleneck开头处扩张的,正好反过来,
所以叫做inverted residual.
因为inverted会更省内存
整体结构如下
如果想进一步减少计算量,可以在除了最后一个layer的其他layer加上width multiplier(缩放channel)
关于shortcut连接到哪一层
pytorch已经有实现好的mobileNet v2接口,使用方法
import torch
model = torch.hub.load('pytorch/vision:v0.10.0', 'mobilenet_v2', pretrained=True)
源码解析可以参考这篇文章