Pytorch之shuffleNet图像分类( 四 )


一方面 , 因为组卷积相比普通卷积降低了计算量 , 因此在给定FLOP的情况下使用组卷积可以使用更多的 , 增加了网络的容量(从而提高了精度) 。然而 , 另一方面 , 增加的数导致更多的MAC 。
假设 g 是1x1组卷积的组数 , 则有:
??????????????????????????????????????????
????????????????????????????????????????????????????????

Pytorch之shuffleNet图像分类

文章插图
给定固定的输入形状c1× h × w , 计算代价B, MAC随着g的增长而增加(线性函数) 。
实验结果如下 , 
通过保持FLOPs一定的情况下 , 改变g的数值 , 以GPU x1 与CPU x1为例进行说明 , 当g=1的时候 , 每秒能推理2451个;当g=2,每秒能推理1725个;当g=8,每秒能推理634个;当g有1到8,它的推理速度下降到原来的1/4还是非常明显的 。但在cpu上我们发现它下降的连一半都不到 。
(3)of
网络设计的碎片化程度越高 , 速度越慢 。这里所说的碎片化可以理解为网络的分支的程度 , 大多数网络在设计的时分支比较多 。
分支可以是串联 , 可以是并联 , 在系列中 , 它就并行了有3x3的卷积层 , 5x5的卷积层 , 还有池化层等等 , 他们就很喜欢采用多分支的结构来进行网络的搭建 。
在系列和自动生成的体系结构中 , 每个网络块都广泛采用了一种多路径结构 。许多小型操作 , 这里称为碎片操作 , 被用来代替几个大的操作 。
虽然这种碎片化结构已经被证明有利于提高准确性 , 但它可能会降低效率 , 因为它对GPU等具有强大并行计算能力的设备不友好 。它还引入了额外的开销 , 比如内核启动和同步 。
对于(e)块结构 , 有4个并行的分支 , 对于每个卷积层都需要有的启动 , 如果四个并行结构计算时间差不多 , 影响较小 。如果相差很大 , 运算快的分支运算完成之后就会一直等着运算比较慢的分支 , 只有等到所有分支全部计算完成后 , 才能进行下一步计算 , 因此效率是比较低的 。
为了量化网络分片如何影响效率 , 作者评估了一系列不同分片程度的网络块 。每个构造块由1到4个1 × 1的卷积组成 , 这些卷积是按顺序或平行排列的 , 每个块重复堆叠10次 , 块结构上图所示 。
其中上图(a) , (b) , (c)对应的与1- , 2-- , 4- , 他们是简单的串行 , 同样是保持FLOPs不变的情况下 , 串行的层数越多 , 碎片化程度越高我们的推理速度也是越来越慢的 。
对于图(d) , (e) , 对应的是2-- , 4-- , 也同样是碎片化程度越高 , 推理速度越慢 。但是在cpu上其实变化是不大的 , GPU变化非常明显 。
(4)-wiseare non-
逐元素操作的执行时间是不可忽略的 。
在像 V1和 V2这样的轻量级模型中 , 逐元素操作占用了相当多的时间 , 尤其是在GPU上 。逐元素运算包括激活函数比如ReLU , 比如分支与主分支的输出进行Add操作 , 比如卷积运算过程中偏置相加等 。
对于每一个元素型操作的都叫-wise ,这些操作的特点都是它的FLOPs很小 , 但是他们的MAC很大 。作者也说了像 也可以看做为-wise。因为它也具有较高的MAC / FLOP比 。