博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)
阅读量:5291 次
发布时间:2019-06-14

本文共 1578 字,大约阅读时间需要 5 分钟。

论文地址:

  • MobileNet由Google提出的一种新的卷积计算方法,旨在加速卷积计算过程。
  • 为了减小网络模型大小,提出了两种比较暴力的裁剪方法。

(1) 直接对channel进行裁剪,这种随机砍掉一些channel,也太暴力了吧,砍多了效果肯定不好,想想都知道。

(2) 减少输入图像的分辨率,也就是减小输入的尺寸大小。

  • 我们还是关注新的卷积计算方法,要做压缩的话,还是另辟蹊径。

819060-20171023200121082-728197409.png

1. Full convolution VS. Depthwise separable convolution

1.1 Full convolution

819060-20171023201403082-877590027.png

  • M表示输入的channel, N表示输出的channel,Dk表示kernel size.
  • 我们可以看到输出的每一个channel,都跟所有的输入channel有关,也就是说,对于输出的一个channel,都是M个kernel与M个channel卷积以后的求和结果。
  • 差别就在这里!在depthwise separable中,每一个输出的channel,只和一个输入的channel有关。

1.2 Depthwise separable convolution

819060-20171023201421238-1476053645.png

  • 输入M个channel,那么输出也是M个channel,每一个channel都是由一个kernel在一个channel卷积以后得到的结果,不在是和所有的输入相关了。这也就是为什么名字叫做depthwise separable(深度级的分离,channel的分离)。

  • 但是我们发现输出只有M个channel,而我们想要输出N个channel,这个时候我们应该想到1*1的convolution,这个时候的卷积就是full convolution。这个时候输出的每一个channel都和输入有关了,相当于输入的加权求和。所以1x1的卷积有联合(combine)的作用。

2. 计算量对比

  • 只要理解了两个的差别,不难算出计算直接的差别。

819060-20171023200237926-1300928664.png

  • Dk表示kernel size, M表示输入的channel,也就是feature map的个数,N表示输出的channel。Df表示feature map的大小,也就是width和height, 上面这个式子再一次验证了我们上面说的,输出的每一个channel都和输入的所有channel有关。

819060-20171023200245769-1564194286.png

  • 求和的左半部分,表示depthwise separable的计算量,可以看到输出为M个channel,每个输出channel只和一个channel有关。

  • 求和的有半部分,表示1x1 pointwise convolution,可以看到每一个输出channel,都和M个输入有关(M个输入的加权求和)。

  • 计算量较少比例

819060-20171023200323348-1338047632.png

3. 模型压缩

819060-20171023200359426-1262494316.png

上面公式可以看到直接对输入的M个channel进行的压缩(随机采样)

819060-20171023200409379-1181596374.png

上面公式可以看到对不仅对输出的channel进行了采样,对输入图像的分辨率也进行了减小。

4. 对比实验

4.1 参数量的对比

819060-20171023200432879-904171499.png

4.2 实验结果

819060-20171023200441144-391102354.png

5. 实现

  • Tensorflow的实现:
  • Caffe实现(trick):
    (通过caffe 的group参数来实现depthwise的操作的,由于实现的问题和cuda/cudnn对其支持得不好,训练起来十分慢。前向预测时在CPU上的耗时大概是googlenet的70%。这个数据参考一篇博文的,未实践过。)
  • Pytorch实现:

6. 总结

  • 根据实践经验的总结,这种新的卷积计算方式,对运算速度的改进还是比较明显的,精度影响不是很大,至于文中说的两个裁剪方法,我觉得还是慎重使用比较好。
  • 现在市面上已经有很多裁剪方法了,没必要用这么暴力的进行裁剪来压缩模型大小。

转载于:https://www.cnblogs.com/zhonghuasong/p/7718685.html

你可能感兴趣的文章
初识HTML
查看>>
mysql locktables
查看>>
django(一)验证码
查看>>
day06 Java基础
查看>>
do...while和while...do的两种场景比较
查看>>
iOS被开发者遗忘在角落的NSException-其实它很强大
查看>>
WPF学习(1) – XAML
查看>>
集合类接口IEnumerable,IEnumerator,ICollection,IList,IDictionary理解
查看>>
Entity Framework返回IEnumerable还是IQueryable?
查看>>
零基础http代理http完美代理访问
查看>>
数组与内存控制笔记
查看>>
关于 Go2Shell (Go2Shell 可以在 Finder 中打开当前目录的终端窗口,是一个对开发者来说非常有用的App)...
查看>>
2008年我买了一本书 书名叫“PHP 6”
查看>>
管道,数据共享,进程池
查看>>
UITableView beginUpdate和endUpdate使用的前提
查看>>
MySQL数据类型
查看>>
Java基础--面向对象编程4(多态)
查看>>
c++第二天
查看>>
【原】迎接微信winphone 5.0 版本的IE10样式兼容
查看>>
linux wget 命令用法详解(附实例说明)
查看>>