萌小帅 一路向前

要有朴素的生活和遥远的梦想,不管明天天寒地冻,路遥马亡...^-^...

论文阅记 MobileNet V1

  论文题目:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

  文献地址:https://arxiv.org/abs/1704.04861?context=cs

  (非官方)源码地址:

  (1)Pytorch实现:https://github.com/rwightman/pytorch-image-models

  (2)Caffe实现:https://github.com/shicai/MobileNet-Caffe

  (3)TensorFlow实现MobileNet - YOLOV3: https://github.com/GuodongQi/yolo3_tensorflow

 

  MobileNet V1中提到的轻量级深度分离卷积思想在MobileNet V2,MnasNet,MobileNet V3,以及单目标追踪算法SiamMask中均得以运用。虽然单独使用MobileNet V1的场景不多,但是了解其思想,对于后续论文的理解有铺垫性的作用。

移动端神经网络现状

  MobileNet的提出是针对移动或者嵌入式的应用场景。大而复杂的模型是难以在嵌入式、FPGA等移动端使用的。视觉模型在移动端使用有两大难题

  1. 模型过于庞大,容易造成硬件内存不足的问题;
  2. 大多场景要求低延迟、响应速度快。【自动驾驶的行人检测如果响应速度慢,则会发生比较可怕的事情】

  因此,研究小而精确的模型对于现实的应用场景十分重要。

  目前的两大解决策略

  1. 对训练好的复杂模型进行压缩得到小模型;    ☆☆☆☆☆
  2. 直接对小模型进行训练;

  保证模型的性能,降低模型的大小,提升模型的速度。

  MobileNet属于后者,其使用了Depth wise separable convolutions。降低了卷积运算的参数量和运算量

  其可以用于目标检测,提出的核心思想是轻量级的卷积运算。在实际应用中,通常会有人选择其升级版MobileNet V2 作为一个快速目标识别的网络,用于获取patch给追踪算法。

核心思想

  MobileNet最核心的层就是深度可分离卷积的设计【depth wise separable  convolutions

  深度可分离卷积是普通卷积分离为深度卷积1*1卷积

  深度卷积的意思就是针对每个输入通道采用不同的卷积核一个卷积核对应一个输入通道,也就是说,虽然有M个卷积核,但总共只有标准卷积的1个卷积核的大小。【一个卷积核是单通道的,M个卷积核相当于对输入的每一个通道,每一个通道对应一个1通道的卷积核。M个卷积核也就是一个与输入feature map 相同通道数量的卷积核。】其实可以理解,为什么要将标准卷积层换分为两个部分:

  ☐  depth wise 的卷积是每一个通道对应一个一层的卷积核,每个通道都对应一个卷积核,这样经过卷积运算后通道数量不会发生变化所以需要1*1卷积进行通道数量的调整

  【深度卷积:depthwise convolution;        1*1卷积: pointwise convolution

  • 下图(a)中是标准的卷积操作,输入feature map的通道数量为M,则N个卷积核的通道数量均为M;
  • 图(b)中是深度可分离卷积操作,输入feature map的通道数量为M,每一个通道对应一个卷积核,这样M个卷积核的参数量相当于只有标准卷积操作一个卷积核;
  • 图(c)中是N个通道数量M的1*1卷积操作,由于图(b)中的输出结果的通道数量不会发生变化,也为M,因此,需要1*1卷积进行通道数量的调整。

  情形:对于输入feature map  F[维度为Df * Df * M] ,输出的feature map G[维度为Dg * Dg * N]

 

  • 标准卷积的卷积核的参数量 Dk * Dk * M * N [Dk表示卷积核的尺寸]。

  如果步长为1,padding也为1,则其对应的计算:

  将会对应计算量为:

  • 深度可分离卷积

  深度卷积计算形式:

  运算量 (从结构图中也可以看出,运算量少N-1个卷积核的操作):

  深度分离卷积运算量:

  一般情况下 N 比较大,那么如果采用3x3卷积核,depthwise separable convolution相较于标准卷积可以降低大约9倍的计算量

网络结构

  在实际应用中会添加BN和ReLU

  

  The full architecture of MobileNet V1 consists of a regular 3×3 convolution as the very first layer, followed by 13 times the above building block.

  整体的网络结构中,包含一个常规的3*3卷积作为第一层,之后包含了13个上述的Depthwise Separable Convolutional block。 Depthwise Separable Convolutional block中没有池化层,而是使用步长为2的DW操作进行下采样PW操作会2倍放大通道数量。如果输入图像的尺寸为 224×224×3,最终网络的输出则为7×7×1024。激活函数使用ReLU6。

y = min(max(0, x), 6)

  最后呢,还会再加上一个平均池化操作全连接层全连接层使用softmax激活函数

总结

  MobileNet V1版本结构其实非常简单,从网络结构上看,其结构是一个非常复古的直筒结构,类似于VGG。这种结构性价比不高,后续一系列的ResNet、DenseNet等结构已经证明通过复用图像特征,使用concat/eltwise+等操作进行特征融合,能极大提升网络的性价比。

  MobileNet V1版本中,Depthwise Conv确实是大大减少了参数量,也降低了计算量。而且N×N 的DW + 1×1的PW的结构在性能上也能接近N × N 的Conv。但是在实际使用中会发现,Depthwise (DW)部分的Kernel容易训练废掉: 即训练之后发现depthwise训练出来的kernel有不少是空的。depthwise每个kernel dim 相对于vanilla conv要小得多过小的kernel_dim加上ReLU的激活影响下, 使得神经元输出很容易变为0, 所以就学废了。 ReLU对于0的输出的梯度为0, 所以一旦陷入了0输出, 就没法恢复了

 

posted on 2020-02-06 20:07  墨殇浅尘  阅读(858)  评论(0编辑  收藏  举报

导航