您的当前位置:首页正文

[PaperNotes]MobileNets: Efficien

来源:华佗小知识

概况

最近关注一下移动端的DL的paper,最终的希望当然是又准又快的object detector了,所以这些算法的baseline精度应当不错,而效率较高。首先是MobileNetv1, arXiv 1704.04681

image.png

解决什么问题

在移动端上的模型Inference加速问题。首先是latency变小,顺带的是模型占用空间变小。

前人工作

1)训练更小的网络
FlattenCNN/FactorizedCNN/SqueezeNet/Xception等。
这些方法下,网络模型确实小了。但是模型小不一定让速度变快。MobileNet则是考虑加速,网络模型变小只是顺带的事情。

2)压缩预训练网络
基于{乘积量化/哈希/剪枝/向量量化/哈夫曼编码/各种factorizations}的压缩;
蒸馏(distillation),也就是用一个大网络来训练小网络;
各种low bit网络,也就用更少的bit取代默认的float类型数据。

方法,MobileNet到底是怎样的

depthwise separable convolutions是基础
首先区分vanilla conv和depth wise separable conv:


conv__.jpg

两个用于模型减小的超参数:width multiplier(宽度乘子),resolution multiplier(分辨率乘子)

有几个词语一开始不理解:
factorize: 意思是分解。
depthwise convolution:首先在[26]中提出,然后在Inception[13]中用到。
pointwise convolution: 这里说的是1x1 conv。

使用到的网络结构:


image.png image.png

可以看到,整个网络结构是stacking许多layer来实现的,AlexNet/VGGNet一样的一路走下去的结构。毕竟是2016年做的工作了。

实验

各种Ablation Studies。其实主要是引入了width multiplier (α)和resolution multiplier(ρ),然后各种实验表格就容易画了。

怎样实现

PointWise Conv(PW Conv)

先说1x1 PointWise Conv:按论文原文的意思,1x1 Conv是计算和模型容量的大头(95%和75%),而1x1 Conv终究还是Conv,Conv层的一种常规实现是转化为GEMM(通用矩阵乘法,general matrix multiply)来实现的:先im2col做reordering来得到GEMM的初值,然后做GEMM。对于1x1 Conv,这个reordering没有必要,反而会拖慢计算速度,而Caffe里面就是有reordering这个东西,所以,不推荐用Caffe啊:


image.png

DepthWise Conv(DW Conv)

再说DepthWise Conv: 按我的理解,DW Conv只占很少的计算量,但是这仅仅是理论。
DW Conv其实就是channel-wise conv,原来的vanilla conv是所有通道一起算,一般是用CuDNN什么的来加速的;现在的DW Conv是按各个通道拆分了,相当于vanilla conv中的Sigma过程被按照各个channel给拆开了,就需要一个CuDNN等的底层实现,用来在训练阶段加速;而inference阶段是在移动端,不考虑GPU加速,就需要并行实现的DW Conv了,否则串行的DW Conv(例如用group conv实现)会拖慢整个Inference速度。

结论:

  • Caffe的实现会很慢,除非自己手动去优化PW和DW。
  • 已经有人提交PR到Caffe-BVLC并且Merge了,提供了DW Conv:
  • Tensorflow官方实现:
  • 本人暂时没有去reproduce也暂时不打算reproduce。先看完mobilenet2/shufflenet/igcv1~3再说了。