[轻量化网络]ShuffleNet V2学习笔记

1. 四条轻量化网络设计准则

如上图所示,分别在GPU和ARM设备上,测试ShuffleNet V1和MobileNet V2在各种操作上的耗时占比,其中:

  • Elementwise:逐元素操作,如RELU函数,残差网络的逐元素相加(shortcut)。
  • Data:数据操作,如输入,输出。
  • Conv:卷积操作。
  • Shuffe:通道重排。

由这个实验可以得出以下结论:

  • 乘-加浮点运算次数FLOPs仅反映卷积层,仅为间接指标。
  • 不同硬件上的测试结果不同。
  • 数据读写的内存MAC占用影响很大。
  • Element-wise逐元素操作带来的开销不可忽略。

 由此引出轻量化网络的四条设计准则:

  • 准则一:输入输出通道数相同时,内存访问量MAC最小。
  • 准则二:分组数过大的分组卷积会增加MAC。
  • 准则三:碎片化操作对并行加速不友好。
  • 准则四:逐元素(Element-wise)操作带来的内存和耗时不可忽略。

注:准则一可以理解为卷积核数量最好与输入的通道数一致;碎片操作指多通路,多分支等,如inception里的分支结构;逐元素操作,如RELU,残差网络的shortcut。

 

2. 原则详解

2.1. 准则一:输入输出通道数相同时,内存访问量MAC最小

2.1.1. 如何计算FLOPs和MAC

 

FLOPs:计算量,只算乘法。在上图中,计算次数为输出的特征大小h*w*c2,每次的计算量为卷积核的大小1*1*c1,总共的计算量为h*w*c2*1*1*c1。
MAC:内存访问量,为输入,卷积核与输出的和。

2.1.2. 证明,均值不等式

通过直角三角边之间的关系,构建均值不等式,只有当C1=C2的时候,不等式才取等号,这个时候MAC最小。

2.1.3. 实验

 

固定FLOPs,通过改变输入输出的通道数比例进行对比测试。1:1的通道数比例的时候,推断速度最快,用来类推此时的MAC最小。

2.2. 准则二:分组数过大的分组卷积会增加MAC

2.2.1. 理论证明

 

计算分组卷积的FLOPs和MAC,将B,h,w,c1设为常数,将B代入MAC公式中:

 

 

当固定输入尺寸c1,计算量B,当g越大,MAC越大。

2.2.2. 实验

 

 在同样的FLOPs下,分组数越多,推断速度越慢。

2.3. 准则三:碎片化操作对并行加速不友好

在很多网络,如GoogLeNet或者AI直接搜出来的网络那样,多路的结构是很常见的。往往这些碎片化操作,虽然有助于提高模型准确率,但对并行加速非常不友好,特别是GPU这种设备,而且也造成了额外的开销,如kernel launch和同步。

实验:

 

 保持FLOPs不变的情况下,设计了单个卷积模块,多个卷积模块串行,多个卷积模块并行的结构。最后结果证明,碎片化操作在GPU上,碎片化操作对推断速度的影响最大,ARM设备的影响反而相对小。

2.4. 准则四:逐元素(Element-wise)操作带来的内存和耗时不可忽略

碎片化操作:RELU,AddTensor,AddBias等。
特点:FLOPs很小,MAC很高。

以是否保留RELU和shortcut,进行实验。
在RELU和shortcut都去掉的情况下,在GPU和ARM上,都获得20%左右的提速。

3. 基本模块设计

根据四个基本准则,目标是设计出这样一个网络:在既不使用标准1*1卷积,也不使用过多分组卷积的前提下,使用尽可能多的channel。
为了实现上面的目标,使用了Channel Split操作。

 

 

c是基本模块,将输入通道分为两部分(论文是均分),一部分进行卷积操作,一部分恒等映射,最后串起来再channel shuffle。V2摒弃了V1的创新点分组操作,用Channel split操作实现了分组的效果。
d是下采样模块,分别用步长为2的卷积操作进行下采样。最后输出的通道数加倍,长宽减半。
“Concat”“Channel Shuffle”“Channel Split”这几个连续的elementwise 操作,可以合并为一个操作,使得更符合准则四。

4. 参考

[1] 【精读AI论文】谷歌轻量化网络MobileNet V2(附MobileNetV2代码讲解)

(完)

posted @ 2022-10-18 13:00  大师兄啊哈  阅读(326)  评论(0编辑  收藏  举报