其他分享
首页 > 其他分享> > ShuffleNet: 一个极端高效的移动端卷积神经网络

ShuffleNet: 一个极端高效的移动端卷积神经网络

作者:互联网

码字不易,欢迎点赞。文章同步发布在公众号:CV前沿

上一篇文章中,我们已经介绍了一种针对移动端和嵌入式设备的卷积神经网络—-MobileNet。今天我们要介绍的是旷视科技在2017年12月份提出的更加高效的移动端卷积神经网络—-ShuffleNet。

在ShuffleNet网络中使用了两个创新的操作:

  1. pointwise group convolution(逐点组卷积)

  2. channle shuffle(通道混洗)

概要来说,逐点组卷积是降低了逐点卷积(也即是1*1卷积)的计算复杂度; 同时为了消除多个组卷积堆叠产生的副作用,采用通道混洗的操作来改善跨特征通道的信息流动。使得ShuffleNet网络在保持准确率的情况下,极大的降低了计算成本。ShuffleNet网络在ImageNet竞赛和MS COCO竞赛中均表现了比其他移动端先进网络更优越的性能。

逐点组卷积

我们在文章中介绍移动端不同类型的卷积操作时,其中讲到了普通卷积、组卷积和逐点组卷积这几个概念。

这里再简单回顾一下,组卷积是在输入特征图的通道方向执行分组;逐点组卷积本只是组卷积的一种特殊形式,特殊的地方在于它的卷积核的核大小为1*1。如下图所示。

在这里插入图片描述

那么为什么ShuffleNet网络要使用逐点组卷积呢?

这要从ResNext讲起。

我们知道,ResNext就是对ResNet的残差单元进行了微创新,创新点就是组卷积,从而提升了网络的精度。ResNet和ResNext的残差单元如下所示。

在这里插入图片描述

ResNet unit 结构图

在这里插入图片描述

ResNext unit 结构图

但对于ResNext的一个残差单元来说,逐点卷积(1*1卷积)占整个残差单元计算量的93.4%,可见逐点卷积的计算成本是很高的。那么在小型网络中,为了符合移动端设备上有限的计算资源,代价昂贵的逐点卷积会导致网络整体变窄(每层通道数变少),进而可能带来精度的大幅度下降。

总结来说,由于逐点卷积的昂贵的计算开销,使得网络在满足设备计算资源情况下,无法满足精度需求。从而这种网络结构不适应于移动端和嵌入式设备。

为了解决这个问题,本文提出了逐点组卷积。逐点组卷积的特点是通过保证每个卷积操作仅仅是作用在对应的输入通道组,使得大大减少了计算量。

我们根据对组卷积的知识,假设组个数为 g g g, 那么逐点组卷积相对于逐点卷积,计算量下降了 g g g倍。

但是,如果多个组卷积堆叠在一起,会产生一个副作用:某个通道的输出结果,仅来自于一小部分输入通道。如下图图(a)。

这个副作用会导致在组与组之间信息流动的阻塞,以及表达能力的弱化。

那么我们如何解决这个问题呢? 这用到了本文的第二个创新—通道混洗。

通道混洗

在这里插入图片描述

如图所示。通过对比图(a)和图(b),我们在第一个逐点组卷积之后,对输出的结果的通道次序进行打乱,比如原始在通道维度上的索引是0,1,2,3,4,5,6,7,8;那么打乱后变为了0,3,6,1,4,7,2,5,8。

经过这样打乱之后,输出通道就不再仅仅来自于是一小部分输入通道,也会来自其他的通道。即输出通道和输入通道完全的关联了。形成的效果如图(c)所示。

通道混洗的操作实现了多组卷积层的跨组信息流动。

ShuffleNet Unit

利用逐点组卷积和通道打乱的操作,我们可以建立一个针对于小型网络特别设计的ShuffleNet unit。

在这里插入图片描述

最初设计是一个残差块(residual block)如图(a)所示。

然后在(a)的残差分支中,对于其中的3 * 3卷积层,我们应用一个计算成本低的3 * 3 的DW卷积。

然后我们替换了第一个逐点卷积,改为逐点组卷积,后面跟一个通道混洗操作。如图(b)所示。

图(b)中的第二个逐点组卷积的目的是为了恢复输出通道数量(升维),从而和输入通道数量一致,以便能够实现与捷径分支的输出结果进行相加操作。(相加要求两个分支的特征图在宽度、高度和深度均一致)

这就形成了一个完整的ShuffleNet unit了。

此外,我们知道卷积神经网络都需要有降采样操作,一种实现方式是采用最大池化层,另一种做法是使用stride=2的卷积来实现。

在ShuffleNet unit中,同样是采用的stride=2的卷积。如图(c)所示。具体做法是分别在捷径分支的分支设置stride=2和主分支的3*3 DW卷积中设置stride=2,从而既能够实现降采样的操作,同时又能够实现两个分支输出结果的融合。

这里还需要注意的两点是:

与ResNet,ResNext计算量的对比

假设输入特征图形状是 c ∗ h ∗ w c*h*w c∗h∗w,以及bottleneck 模块的通道数是m,那么三个网络的残差单元的计算量分别是:

ResNet unit:

1 ∗ 1 ∗ c ∗ m ∗ h ∗ w + 3 ∗ 3 ∗ m ∗ m ∗ h ∗ w + 1 ∗ 1 ∗ m ∗ c ∗ h ∗ w = h w ( 2 c m + 9 m 2 ) 1*1*c*m*h*w+3*3*m*m*h*w+1*1*m*c*h*w = hw(2cm+9m^2) 1∗1∗c∗m∗h∗w+3∗3∗m∗m∗h∗w+1∗1∗m∗c∗h∗w=hw(2cm+9m2)

ResNext unit:
1 ∗ 1 ∗ c ∗ m ∗ h ∗ w + ( 3 ∗ 3 ∗ m ∗ m ∗ h ∗ w ) / g + 1 ∗ 1 ∗ m ∗ c ∗ h ∗ w = h w ( 2 c m + 9 m 2 / g ) 1*1*c*m*h*w+(3*3*m*m*h*w)/g+1*1*m*c*h*w = hw(2cm+9m^2/g) 1∗1∗c∗m∗h∗w+(3∗3∗m∗m∗h∗w)/g+1∗1∗m∗c∗h∗w=hw(2cm+9m2/g)

ShuffleNet unit:
( 1 ∗ 1 ∗ c ∗ m ∗ h ∗ w ) / g + 3 ∗ 3 ∗ m ∗ h ∗ w + ( 1 ∗ 1 ∗ m ∗ c ∗ h ∗ w ) / g = h w ( 2 c m / g + 9 m ) (1*1*c*m*h*w)/g+3*3*m*h*w+(1*1*m*c*h*w)/g = hw(2cm/g+9m) (1∗1∗c∗m∗h∗w)/g+3∗3∗m∗h∗w+(1∗1∗m∗c∗h∗w)/g=hw(2cm/g+9m)

可见,ShuffleNet unit需要的计算量最小。

换句话说,在给定的有限的计算资源下,ShuffleNet 能够使用更宽的特征图。
作者发现这对于小型网络来说至关重要。因为通常小型网络通常有很少的通道数来处理信息。

完整的网络结构

在这里插入图片描述

如图所示。可以看出,ShuffleNet 主要是由ShuffleNet unit 堆叠而成,并划分了Stage2、Stage3、Stage4三个阶段。在每个阶段的第一个模块中设置stride=2,从而实现降采样的功能。然后从一个阶段到下一个阶段,会实现通道数的加倍。

在ShuffleNet unit 中,组个数 g g g代表着逐点卷积的连接稀疏程度。在上图中展示了不同的组数量的方案,同时通过调整输出通道数(网络的宽窄),来使得整体的计算量大致相同。那么对于一个给定的计算量约束, g g g越大,那么就可以设置越多的卷积核,产生越多的输出通道。从而帮助编码更多的信息。

最后,和MobileNet一样,ShuffleNet 也有一个宽度系数,来灵活调整整个网络的参数和计算量。

实验

实验1 group 数量

在这里插入图片描述

实验2 有无通道混洗

在这里插入图片描述

实验显示,包含通道混洗的网络,均比不包含通道混洗的网络的效果好。

实验3 与MobileNet 的对比

在这里插入图片描述

已知MobileNet 同样是专注于移动端的高效的卷积神经网络。具体分析如下:

小结

ShuffleNet 针对现大多数模型采用的逐点卷积存在的问题,提出了逐点组卷积和通道混洗的处理方法,并基于这两个操作提出了一个ShuffleNet unit,最后在多个竞赛中证明了这个网络的效率和精度。

本文介绍到这里就结束了,下一篇会介绍ShuffleNetV2,让我们拭目以待。

码字不易,欢迎点赞
文章同步发布在公众号:CV前沿

标签:卷积,逐点,网络,ShuffleNet,神经网络,unit,通道
来源: https://blog.csdn.net/u010414589/article/details/117023576