热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习:mobileNetV2解读

原论文:https://arxiv.org/pdf/1801.04381.pdf

mobileNetV2分析
文章在residual net和MobileNet V1的基础上,提出MobileNet V2模型,一方面保证准确性,另一方面大幅的减少multiply-adds(MAdd)的计算量,从而减少模型的参数量,降低内存占用,又提高模型的计算速度,以适应移动端应用。

Block 基本结构
文章的主要贡献:提出一种颠倒的、bottleneck为线性变换的resdual 结构。这中结构的一个block如下:
输入:一个低维 k(通道)的、经压缩的数据
然后经过:
step 1, point wise卷积扩展维度(通道),扩展因子为t;
step 2, depthwise separable 卷积,stride为 s;
step 3, linear conv把特征再映射的低维,输出维度为 k’;
输出作为下一个block的输入,堆叠block。
具体结构如表:
深度学习:mobileNetV2解读

  1. Depthwise separable conv
    这种卷积方式早已被广泛使用,实现方法是把常规卷积层分为两个独立的层。第一层称为depthwise convolution,对输入的每个通道做单独的卷积,第二层称为pointwise convolution,使用1x1的卷积核做常规卷积。
    如果使用的是kxk的卷积核,这种卷积几乎能减少k2的计算量。

  2. Linear bottlenecks
    用线性变换层替换channel数较少的层中的ReLU,这样做的理由是ReLU会对channel数低的张量造成较大的信息损耗。ReLU会使负值置零,channel数较低时会有相对高的概率使某一维度的张量值全为0,即张量的维度减小了,而且这一过程无法恢复。张量维度的减小即意味着特征描述容量的下降。因而,在需要使用ReLU的卷积层中,将channel数扩张到足够大,再进行**,被认为可以降低**层的信息损失。文中举了这样的例子:
    深度学习:mobileNetV2解读
    上图中,利用nxm的矩阵B将张量(2D,即m=2)变换到n维的空间中,通过ReLU后(y=ReLU(Bx)),再用此矩阵之逆恢复原来的张量。可以看到,当n较小时,恢复后的张量坍缩严重,n较大时则恢复较好。

  3. inverted residual sturcture
    深度学习:mobileNetV2解读
    原residual structure 出自Deep Residual Learning for Image Recognition. 这种结构解决了深度神经网络随着网络层数的加深带来的梯度消失/爆炸,模型不收敛的问题,使DNN可以有上百甚至更多的层,提高准确率。
    从图中可以看出,这种结构使用一个快捷链接(shortcut)链接了block的输入与输出(实际做的是element wise add),block内部是常规conv,一般block内部数据的维度低于block边缘–即bottleneck的数据维度。
    论文的题目,inverted residual,颠倒的正是block 内数据维度与bottleneck数据维度的大小,这从上图的中数据块的深度情况可以看出。
    这种颠倒基于作者的直觉:bottleneck层包含了所有的必要信息,扩展的层做的仅仅是非线性变换的细节实现。
    实际上,这中翻转能节省内存,分析见后。

MobileNet V2网络结构
网络机构如下:
深度学习:mobileNetV2解读
上图中,t代表单元的扩张系数,c代表channel数,n为单元重复个数,s为stride数。注意,shortcut只在s==1时才使用。
实验
文章从classification、detection、segmentation三个应用方面测试了该模型的效果。

  1. classification
    直接使用MobileNetV2的结构,输入图像size为224x224,在Imagenet上的分类表现
    深度学习:mobileNetV2解读

2.detection
使用预训练的MobileNetV2卷积层特征+SSD的检测网络,输入图像size为320x320,在mscoco上的表现如下表:
深度学习:mobileNetV2解读

3.segementation
使用预训练的MobileNetV2卷积层特征+DeepLabv3分割网络,
深度学习:mobileNetV2解读

结论
社区对MobileNetV2的评价还是很高的,而且简单易实现,可以作为基本层用到detection和segmentation等领域。
转自:
https://blog.csdn.net/qq_14975217/article/details/79410324
附带其代码:https://github.com/neuleaf/MobileNetV2

另外这篇笔记也分析得不错:https://blog.csdn.net/u014380165/article/details/79200958?utm_source=blogxgwz3

mobileNetV2与其他模型比较
V2 主要引入了两个改动:Linear Bottleneck 和 Inverted Residual Blocks。

  1. 对比 MobileNet V1 与 V2 的微结构
    深度学习:mobileNetV2解读

相同点
都采用 Depth-wise (DW) 卷积搭配 Point-wise (PW) 卷积的方式来提特征。这两个操作合起来也被称为 Depth-wise Separable Convolution,之前在 Xception 中被广泛使用。这么做的好处是理论上可以成倍的减少卷积层的时间复杂度和空间复杂度。由下式可知,因为卷积核的尺寸 K 通常远小于输出通道数 C_{out},因此标准卷积的计算复杂度近似为 DW + PW 组合卷积的 K^2 倍。

深度学习:mobileNetV2解读

不同点:Linear Bottleneck
V2 在 DW 卷积之前新加了一个 PW 卷积。这么做的原因,是因为 DW 卷积由于本身的计算特性决定它自己没有改变通道数的能力,上一层给它多少通道,它就只能输出多少通道。所以如果上一层给的通道数本身很少的话,DW 也只能很委屈的在低维空间提特征,因此效果不够好。现在 V2 为了改善这个问题,给每个 DW 之前都配备了一个 PW,专门用来升维,定义升维系数 t = 6,这样不管输入通道数 C_{in} 是多是少,经过第一个 PW 升维之后,DW 都是在相对的更高维 ( t \cdot C_{in} ) 进行着辛勤工作的。
V2 去掉了第二个 PW 的**函数。论文作者称其为 Linear Bottleneck。这么做的原因,是因为作者认为**函数在高维空间能够有效的增加非线性,而在低维空间时则会破坏特征,不如线性的效果好。由于第二个 PW 的主要功能就是降维,因此按照上面的理论,降维之后就不宜再使用 ReLU6 了。

  1. 对比 ResNet 与 MobileNet V2 的微结构
    深度学习:mobileNetV2解读

相同点
MobileNet V2 借鉴 ResNet,都采用了 1 \times 1 \to 3 \times 3 \to 1 \times 1 的模式。
MobileNet V2 借鉴 ResNet,同样使用 Shortcut 将输出与输入相加(未在上式画出)

不同点:Inverted Residual Block
ResNet 使用 标准卷积 提特征,MobileNet 始终使用 DW卷积 提特征。
ResNet 先降维 (0.25倍)、卷积、再升维,而 MobileNet V2 则是 先升维 (6倍)、卷积、再降维。直观的形象上来看,ResNet 的微结构是沙漏形,而 MobileNet V2 则是纺锤形,刚好相反。因此论文作者将 MobileNet V2 的结构称为 Inverted Residual Block。这么做也是因为使用DW卷积而作的适配,希望特征提取能够在高维进行。

  1. 对比 MobileNet V1 和 V2 的宏结构

MobileNet v1
深度学习:mobileNetV2解读
MobileNet v2
深度学习:mobileNetV2解读
基本参数汇总
深度学习:mobileNetV2解读

官方实现源码:https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet

该部分转自:https://zhuanlan.zhihu.com/p/33075914

补充部分

**函数
sigmoid,tanh,relu 的比较。
在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是**函数 Activation Function。
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,**函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
https://blog.csdn.net/u011684265/article/details/78039280

depthwise convolution 和 pointwise convolution
Depthwise(DW)卷积与Pointwise(PW)卷积,合起来被称作Depthwise Separable Convolution(参见Google的Xception),该结构和常规卷积操作类似,可用来提取特征,但相比于常规卷积操作,其参数量和运算成本较低。所以在一些轻量级网络中会碰到这种结构如MobileNet。

常规卷积操作
对于一张5×5像素、三通道彩色输入图片(shape为5×5×3)。经过3×3卷积核的卷积层(假设输出通道数为4,则卷积核shape为3×3×3×4),最终输出4个Feature Map,如果有same padding则尺寸与输入层相同(5×5),如果没有则为尺寸变为3×3。
深度学习:mobileNetV2解读
Depthwise Separable Convolution
Depthwise Separable Convolution是将一个完整的卷积运算分解为两步进行,即Depthwise Convolution与Pointwise Convolution。

Depthwise Convolution
不同于常规卷积操作,Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积。上面所提到的常规卷积每个卷积核是同时操作输入图片的每个通道。
同样是对于一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,不同于上面的常规卷积,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),如下图所示。
深度学习:mobileNetV2解读

Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。
Pointwise Convolution
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。如下图所示。
深度学习:mobileNetV2解读
该部分转自:
https://blog.csdn.net/tintinetmilou/article/details/81607721

模型简介,附带源码及图像分类库:
https://blog.csdn.net/yH0VLDe8VG8ep9VGe/article/details/79824140?utm_source=blogxgwz3


推荐阅读
author-avatar
手机用户2502941011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有