原文: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

论文链接:https://arxiv.org/abs/1807.11164

开源代码增加自定义layer(caffe版本):https://github.com/anlongstory/ShuffleNet_V2-caffe

开源代码(tensorflow版本):https://github.com/TropComplique/shufflenet-v2-tensorflow

原文链接:https://blog.csdn.net/linmingan/article/details/81383912

现在很多模型的速度评估都是用FLOPs这个指标,但这个指标用来评价速度是不直接的。因为影响模型速度的因素不仅仅是FLOPs,内存访问操作所消耗的计算(memory access cost,MAC),以及平台因素。

对于MAC这种情况,有很多操作会有非常高的MAC,比如分组卷积,因此我们应该尽量少用分组卷积。另一个情况是,低并行性,如inception系列的多尺度卷积核。

对于平台因素,以GPU的张量分解来说。在一些论文里,提出了FLOPs减少75%的张量分解,理论上应该是加速了很多的。但是在GPU中却慢了很多。论文认为,这是因为CUDNN是针对3*3的卷积进行优化的,我们不能想当然的认为3*3卷积会比1*1卷积慢9倍。我们可以进一步看看不同平台,在不同操作上消耗的计算:

在GPU上,不管是shuffleNet V1还是MobileNet V2卷积和其他的一些消耗MAC的操作所消耗的计算是差不多的。但是在ARM上卷积消耗的计算比MAC消耗的计算更多。

高效CNN网络设计的四个准则(Practical Guidelines for Efficient Network Design)
     论文提出了一些提高速度的网络结构设计原则,这些原则主要是针对GPU和ARM硬件。另外,论文中的FLOPs只考虑卷积操作,其他的一些操作如data I/O,data shuffle,element-wise 操作(add,relu等)也会用来评估计算速度。接下来介绍一下具体的指导原则:

G1、使用相同的通道数来最小化MAC

现在有很多模型都会使用可分离卷积,在可分离卷积中,1*1卷积的计算量最大。我们研究了不同的输入通道和输出通道对速度的影响。

对于输入通道为c1c1,输出通道为c2c2,特征图大小为wh,1*1卷积的FLOPs,B=hwc1c2B=hwc1c2。为了简单起见,我们假设cache能够容纳所有的特征图和卷积核参数。这样我们可以计算出MAC=hw(c1+c2)+c1c2MAC=hw(c1+c2)+c1c2(访问内存的次数,因为特征图大小为hw,在计算1*1卷积过程中我们需要将将所有的输入特征图和卷积核载入cache一次,这样需要hwc1+c1c2hwc1+c1c2次访存;然后需要将计算结果返回到内存,需要hwc2hwc2次访存。),根据高中学过的不等式原理,可以得到:

因此在给定FLOPs时MAC有一个下界,MAC等于这个下界的条件为输入通道和输出通道相等。

当然上面的结论是理想情况下的。在现实中很少有cache的大小能够非常大。为了验证上面的结论,论文设计了一个基准网络结构作为实验:由10个block构成,每个block包含两个卷积层,第一个的输入通道为c1c1,输出通道为c2c2,第二个卷积固定。

上面的表,给出了实验结果。每一行表示,总的FLOPs相同,但是输入通道数和输出通道数不一样的计算速度。可以发现通道数相等的时候,速度最快。

G2、过多的分组卷积会增加MAC

在shuffleNet V1中大量的使用了分组卷积来降低FLOPs,但事实上却增加了MAC。分组卷积的MAC为:

其中B=hwc1c2/gB=hwc1c2/g,g为组数。在输入大小c1∗h∗wc1∗h∗w和B固定的情况下,随着g的增加MAC也会增加,见下表。

G3、网络分支会降低并行性

在inception系列中,大量使用了“多路”结构作为网络的基础block。很多小的操作集代替大的操作。比如在NASNET-A中的分支操作有13个,而ResNet只有2或者3个。 
      尽管这样的分支能够提升精度,但是对像GPU这种高并行设备的并行性却很不友好。因为这引入了其他的操作,比如kernel的启动和同步。 
     论文使用了1到4个1*1的卷积构造一个block,构造方法有串联和并行两种:

对应的实验结果:

在GPU上,4分支会比1分支慢3倍,但是在ARM中则差不多。

G4、Element-wise操作不可忽视

element-wise操作,比如ReLU,ADD,尽管他们的FLOPs都很小,但是MAC却很大。特别的,depthwise convolution也是一个高MAC/FLOPs率的element-wise操作(这就是为什么depthwise卷积很难达到理论上的加速)。 
        论文利用ResNet中的block进行实验,对比了有ReLU和shortcut操作,和没有ReLU和shortcut操作的速度。结果显示去掉这两个操作后GPU和ARM上都有20%的速度提升。具体看表:

总结与讨论

基于上面的那些指导和经验,论文认为一个高效的网络结构应该包含一下几个要点: 
1、使用平衡的卷积,即通道数一样 
2、意识到分组卷积所带来的计算消耗 
3、减少网络分支 
4、减少element-wise操作

在shuffleNet V1中使用了大量的分组卷积,这违反了G2;bottleneck-like的block,这违反了G1。在mobileNet V2中使用了inverted bottleneck,这违反了G1;在稠密的特征图上使用了depthwise卷积和ReLU,这违反了G4。而在自动生成的网络中,其分支数太高,这违反了G3。

ShuffleNet V2

论文为了达到上面的高效网络结构设计原则。使用了一个叫channel split操作,该操作很简单。如下图所示:

图中的(a)和(b)都是shuffleNet V1里面的block。(c)和(d)则为shuffleNet V2的block。

在(c)中我们可以看到channel split操作,该操作将输入通道为c的特征图分为个分支,每个分支分别有c−c′c−c′和c′c′(在论文中为c/2)个通道的特征图。在(c)中,利用channel split分出两个分支后(满足G3),左边的分支不做任何操作,右边的分支包含了3个卷积操作,并且其通道数都一样(满足G1)。相比shuffleNet V1两个1*1卷积不再是分组卷积(channe split已经进行了通道分组了),这满足了G2。 
        两个分支用concat操作进行合并,这样使得block的输入通道数和输出通道数一样,这满足了G1。合并后,紧接这使用了channel shuffle操作。

需要注意的是,这样的block,已经没有了shuffleNet V1中的Add和ReLU操作了。同时depthwise卷积只在一个分支里面。并且concat,channe shuffle以及channel split这三个element-wise操作,可以合并到一个单独的element-wise操作,这满足了G4。

由于(d)中没有了channel split,因此该block的输出通道是输入通道的两倍。

整个shuffleNet V2结构如下: 

实验结果

论文做了不少实验,并进行了讨论。我们只看看最终的实验比较。从下表,可以看出shuffleNet V2在ARM平台上都是最快的。在GPU上还是mobileNet V1快一些。

轻量化网络:ShuffleNet v2解析相关推荐

  1. 轻量化网络—ShuffleNet V1 V2理解

    轻量化网络-ShuffleNetV2理解 ShuffleNetV2原始论文:https://openaccess.thecvf.com/content_ECCV_2018/html/Ningning_ ...

  2. 突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨happy 审稿丨邓富城 编辑丨极市平台 极市导读 本文从HRNet与轻量化网络ShuffleN ...

  3. 【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...

    作者丨happy 审稿丨邓富城 编辑丨极市平台 极市导读 本文从HRNet与轻量化网络ShuffleNet的组合出发,针对置换模块存在的计算瓶颈问题,提出了一种高效条件通道加权单元替换1x1卷积,并得 ...

  4. 轻量化网络:ShuffleNet V2

    Guideline 1-4: ShuffleNet V2 疑问: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture ...

  5. 经典网络结构 (八):轻量化网络 (SqueezeNet, MobileNet, ShuffleNet)

    目录 SqueezeNet Fire Module: Squeeze and Expand SqueezeNet SqueezeNet 总结 MobileNet 深度可分离卷积 (Depthwise ...

  6. 【神经网络】(11) 轻量化网络MobileNetV1代码复现、解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 复现轻量化神经网络模型 MobileNetV1.为了能将神经网络模型用于移动端(手机)和终端(安防监控.无人驾驶)的实时计算,通常这些设备 ...

  7. 轻量化网络MobileNet解析

    论文题目:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文链接:https:/ ...

  8. 【魔改YOLOv5-6.x(上)】结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet

    文章目录 前言 一.Shufflenetv2 论文简介 模型概述 加入YOLOv5 二.Mobilenetv3 论文简介 模型概述 深度可分离卷积 逆残差结构 SE通道注意力 h-swish激活函数 ...

  9. 实时互动下视频 QoE 端到端轻量化网络建模

    在实时视频互动中,影响观众对视频体验的有较多且复杂的因素,包括:画质.流畅度以及与其耦合的观看设备等.传统客观算法会利用网络传输或编解码参数拟合接收端人的感知体验,或者使用图像质量结合其他相关参数拟合 ...

  10. 旷世轻量化网络ShuffulNetV2学习笔记

    旷世轻量化网络ShuffulNetV2学习笔记 ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design Ab ...

最新文章

  1. 惊!YOLOv5重磅来袭!还是基于Pytorch实现?
  2. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境...
  3. 判断当前时间是否大于零点_入伏是祛湿最佳时间!中医教你3招判断是否湿气重...
  4. python RuntimeError: maximum recursion depth exceeded
  5. 设计模式一:设计模式遵循的原则
  6. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序
  7. Silverlight 异步单元测试
  8. P3-weixin-2.0.1 版本发布,JAVA微信插件框架
  9. 不高兴的津津(信息学奥赛一本通-T1111)
  10. 【angularjs】【学习心得】ng-class总结
  11. ssms中怎么设置自增_如何在SSMS状态栏中设置自定义颜色
  12. ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
  13. Python股票分析系列——系列介绍和获取股票数据.p1
  14. 无法启动QPCore Service
  15. JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
  16. html 如何遍历json,Jquery, JS遍历JSON数组 - HTML5
  17. 三体 读后思考-泰勒展开/维度打击/黑暗森林
  18. 自然语言处理(NLP)- 一个英文拼写纠错系统
  19. 计算机操作系统之设备管理思维导图
  20. 基克的聚合 机器人_LOL:基克的聚合是否只适合硬辅们,软辅们能否借它发挥?...

热门文章

  1. 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos
  2. 服务器租用过程中网站被黑,怎么解决这种情况?
  3. 嵌入式linux学习笔记--TCP通讯整理
  4. java 按字节读入_Java按字节读取文件
  5. 蟠桃会(递推逆序求解)
  6. 01-2016.07-小学期游戏开发《坦克大战》
  7. 100°C TALK百度健康行业沙龙:大数据赋能大健康产业发展
  8. AAAI 2021-TextGAIL:Generative Adversarial Imitation Learning for Text Generation
  9. html制作电影界面,电影网站界面设计HTML_CSS模板
  10. 刷脸支付是顺应时代和科技发展趋势的创新