MobileNet V1
思想
思想主要来源于Xception,Xception也是谷歌的作品,主要就是引入了separable convolution,mobilenet整个网络就是用了这种结构。当然,把普通的卷积分为depth-wise的卷积核point-wise的卷积可以大大的减少计算量,理论分析这里就不说了,论文里说的很清楚,网上也有不少分析的文章。直接上MobileNet的结构吧。
结构

在上图中,Conv dw
代表depth-wise卷积,不加dw代表point-wise卷积,实际上也就是kernel为1的普通卷积。
实验结果
Seperable Conv的功效

MobileNet的结构上文已经说清楚了,这里的对比实验,Conv MobileNet将MobileNet中的dw,pw卷积换成了普通卷积,可以看出,MobileNet在大大减少了参数的基础上,精度损失只有1.1%
窄vs浅

从这里可以看出,一定程度上,窄比浅更好一点,可以很大的减少参数量,精度还高
不同宽度的MobileNet

不同宽度的MobileNet下的实验,其中1.0是标准的,其余的宽度分别是1.0版本的0.75,0.5……参数量和精度的变化都在表格中
不同resolution图片对于精度的影响

计算量、模型参数和精确度的关系


和其他网络的比较


结论
综合MobileNet的实验,给人的感觉:
- 宁愿变窄,不要变浅
- 对于MobileNet的网络,重要度排序:深度 >> 图片尺寸 ≈ 宽度。所以,想要减小计算量,首先要想的是减少宽度和图片大小,迫不得已再是网络深度。当然,这件事情要辩证看,也许MobileNet的实验只能说明某种程度上是这样,如果网络深度冗余太高,也许裁掉一些也还OK。
MobileNet V2
思想
MobileNet V2继承了V1的思想,卷积依然使用的是separable的卷积。但是在此基础上文章又提出了如下观点:
- 我们模型想要学习的高维流形是可以嵌入到低维流形中的
- 把高纬度的流形变成低维流形很简单,只需要减少filter的channel数量就可以了,实验证明一定程度上减小filter数量不会使模型精度降低,但是减多了就不行了,原因见下一条。
- 神经网络会使用激活函数,比如ReLU,但是ReLU激活函数是会丢失一些信息的,即所有负数都变成了0了,这个过程就丢失了信息,所以让ReLU在高维度流形中进行是有必要的,这样,某些维度丢失掉的信息可能可以通过其他维度弥补回来,实验也证明,ReLU在低维情况下丢失的信息比在高维时要多,比如下面这张图,显然,维度越高,恢复之后越接近原图。
- 为了利用可能丢失的信息,还可以利用residual的方式,来减少信息的丢失。

- 通过以上三点,我们可以得出以下结论:设计神经网络时层与层之间的filter数量可以减少以降低维度,这样可以有效减少计算量,但是根据上述观点1可知,这样可以玩。但是为了防止激活函数丢失信息,在有激活函数的地方,维度必须高,保证信息丢失少,在经过激活函数后,再把维度降下来。因此。。。
结构
MobileNet中的基本block如下:

一个block包含以上三层,可以看出,前两层是有激活函数ReLU的,因为前两层通过卷积把filter的数量变成了原来的t倍,这样即使有ReLU,信息丢失也不多,但是在最后一层,仅仅是一个线性层,因为此时维度又被降下来了,会使信息丢失。其中用到的卷积也都是separable的卷积。
MobileNet V2的整体结构如下:

这里提到的bottleneck就是上面那张图的三层结构。
实验结果
分类


语义分割

网友评论