码字不易,转载请注明出处~~
tags: pointwise group convolution; channel shuffle
论文题目《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
论文思想
相比较其他的模型压缩、模型剪枝或者位编码等模型压缩方法,本文更加专注于直接设计一个高效的框架来直接获得高效的基础网络。鉴于以往的Xception或者ResNext网络因为使用了大量的 1 × \times × 1 的卷积而导致在小模型上精度下降,所以提出使用1 × \times × 1 分组卷积来降低计算复杂度。同时为了消除分组卷积带来的负面效应,采用了通道打乱(channel shuffle) 的方法来保证信息的流动。相比较其他网络而言,shufflenet能够使用更多的特征通道,这样对于网络的精度保持会有很大帮助。
两种方法:
-
分组卷积
其实分组卷积并不是什么新鲜的东西,早在AlexNet中,就通过将模型部署到2台GPU上进行训练,后来的ResNext里面作者用了多路卷积的方式也实现了组卷积;最近在Xception中和MobileNet中都使用了depthwise separable convolution也包含着分组卷积的思想。 -
通道打乱
这个方法很少被一些模型使用,而在这里,通过在分组卷积后接通道打乱的操作,可以在很大程度上避免分组卷积打来的边界效应,从而提升模型的表现能力。
方法提出思路
作者认为,在以前的Xception或者ResNext 中,都没有大量充分使用1
×
\times
× 1卷积核所带来的计算量和参数的优势,因此模型的计算量和参数量都还是很大的。而对于小的网络模型如shufflenet而言,可能单纯的使用
1
×
\times
× 1 卷积都可能带来非常大的计算开销。因为传统的卷积方式都是将每个卷积核分别与输入通道进行卷积后相加输出结果,这个过程计算量还是很大的。之前的MobileNet对这方面进行了改进。而这里shufflenet可以说非常充分的借鉴了MobileNet的思想。即进行depthwise separable convolution。但是又不能仅仅这样做,不然的话,就和MobileNet一样了。因此再借鉴了一下ResNext的想法,干脆分组做,这样就既做了depthwise separable convolution,又利用了group的优势,两全其美!
通过上面(a)图,我们可以看出,如果仅仅进行group卷积是不行的,因为这就意味着,每组卷积核只能够对特征的部分内容进行运算,这就导致了后续卷积结果的特征层都只保留输入特征的部分信息,结果肯定是不行的。那么怎么办呢?MobileNet的做法是,不分组,然后1
×
\times
× 1之后直接相加结合,就和传统卷积一样。但是这里分组卷积后又不能直接融合,不然和MobileNet一样了!既然得消除分组带来的劣势,那就再将他们融合起来,所以这里进行了有序的打乱,将不同分组的结果进行重组。
主要关注中间特征层的处理,(a)和(b)中的特征层处理结合起来就是(c)中的表示。做法就是将每个分组卷积之后的中间特征图又进行了进一步划分,然后再这些小的特征图中进行打乱,当然,这里的打乱并不是完全shuffle,而是有规律的重新组合,这样可以保证每组中间的特征图都包含其他组的特征,相当于进行了特征的重新组合,结果如下:
可以看到,没有经过shuffle的特征的准确率下降挺多的,因此也证明了shuffle是有用的,皆大欢喜!
ShuffleNet 单元结构的探索
那么,shuffleNet的结构单元应该长什么样呢?
(a)是ResNet的结构单元,其流程为:input
→
\rightarrow
→ 1
×
\times
× 1conv
→
\rightarrow
→ BN+Relu
→
\rightarrow
→ 3
×
\times
× 3 DWconv
→
\rightarrow
→ BN+ Relu
→
\rightarrow
→ 1
×
\times
× 1conv
→
\rightarrow
→ BN ,最后进行跳层相加。
(b)对(a)中的单元进行改进,其流程为:input
→
\rightarrow
→ 1
×
\times
× 1Gconv
→
\rightarrow
→ BN + Relu
→
\rightarrow
→ Channel Shuffle
→
\rightarrow
→ 3
×
\times
× 3 DWconv
→
\rightarrow
→ BN
→
\rightarrow
→ 1
×
\times
× 1Gconv
→
\rightarrow
→ BN
→
\rightarrow
→ output
注意:这里没有对3
×
\times
× 3之后的BN进行Relu,而且在最后一次进行 1
×
\times
× 1Gconv之后没有再进行shuffle,原因是对于结果来说,影响不大。
(c)是当网络通道数发生变化时,如何改变通道。从图上可以看出,其右边的半支基本没有发生变化,仅仅是在坐边进行了3
×
\times
× 3的平均池化,然后将其结果与右半支的结果进行concat,注意,这里是拼接,而不是相加。原因很简单,为了增加通道。
ShuffleNet网络结构
不同数量的分组模型准确度对比
这里,作者造了一个参数s用来控制ShuffleNet网络的运算量,假设原来网络卷积核有m个,那么这个时候就有s
×
\times
× m个卷积核,这样就可以通过增加或者减少卷积核来增加或者减少运算量。从上图中,作者发现,一直增加group的数量并不能带来性能的线性提升,因为增加group让每个卷积处理的信息变少,即使进行shuffle也不能带来这方面的影响,具体使用还是看实际情况。而且shufflenet对于小网络而言,持续增加group的数量却能够提升网络性能,作者并未分析原因。可能对于小网络来说,增加输入特征的宽度能够得到很好的性能提升。