轻量化网络:ShuffleNetv2解析

轻量化⽹络:ShuffleNetv2解析
原⽂: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
现在很多模型的速度评估都是⽤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快⼀些。

本文发布于:2024-09-24 05:25:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/98360.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   操作   通道   分组
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议