在学习ShuffleNet内容前需要简单了解卷积神经网络和MobileNet的相关内容,大家可以去看我之前的一篇博客MobileNet发展脉络(V1-V2-V3),,接下来步入正题~
卷积神经网络被广泛应用在图像分类、目标检测等视觉任务中,并取得了巨大的成功。然而,卷积神经网络通常需要较大的运算量和内存占用,在移动端以及嵌入式设备等资源受限的环境中受到限制,因此需要进行网络压缩。
ShuffleNet是旷视推出的轻量级网络模型,旨在不过多牺牲模型性能的同时大幅度减小模型的尺寸和加快模型的运算速度。ShuffleNet和MobileNet是同年提出的工作,专门为计算资源有限的设备设计的神经网络结构。两者从两个不同的角度来分析卷积。MobileNet通过深度可分离卷积来实现模型的压缩,而ShuffleNet利用了分组点卷积pointwise group convolution来降低参数量,利用通道重排channel shuffle操作来增强不同通道之间的交互和融合。在保留了模型精度的同时极大减少了计算开销。
常规卷积操作输入有几个通道,卷积核就有几个通道,同时有多少个卷积核就生成多少个feature map,因此,对于一个7x7x3的输入,使用3x3x3的卷积核进行卷积,卷积核的个数共有128个,所以输出就是5x5x128的feature map.
如上图,分组卷积将12个通道的输入分成3组,每组4个通道,每一组的通道使用两个卷积核进行卷积,得到2个feature map,三组就得到6个feature map。可以看出最终的输出是和标准卷积相同的,但是在计算过程中的参数量降低为原来的1/3.
同理,分组卷积就是使用一半维数的卷积核去处理一半维数的输入,最终将处理的结果拼接到一起就形成了最终的输出。
ShuffleNet中的点卷积和MobileNet中的深度可分离卷积中的点卷积一样,即执行1x1卷积来融合所有通道上的信息。深度卷积每个卷积核只处理1个输入特征通道,在这个过程中通道与通道之间的联系被切断,所以后面需要再用 1x1 大小的逐点卷积层来处理M个特征通道之间的信息。
分组点卷积也就是说又点卷积又分组,即将分组卷积中的卷积核的大小变为1*1的点卷积。但是这里的点卷积就不是贯通输入全通道了,而是贯通分组后的每一组的全通道。
通道重排的过程如上图所示,先将通道排成一行,然后reshape成g行n列的矩阵,再对这个矩阵进行转置,最终将转置后的矩阵进行展平,按照组数去取其中的元素就是重排后的组的元素。
(a)表示Resnet的结构示意图,其中右边将3x3的常规卷积替换成了3x3的深度可分离卷积,左边是利用shortcut connection恒等映射,逐元素相加最后再接Relu激活。
(b)表示正常ShuffleNet的模块,右边先进行分组点卷积,然后通道重排,其次接3x3深度可分离卷积,最后接分组点卷积输出。左边利用shortcut connection恒等映射,逐元素相加最后再接Relu激活。
(c)表示降采样的ShuffleNet的模块,右边先进行分组点卷积,然后通道重排,其次接步长为2的3x3深度可分离卷积进行降采样,最后接分组点卷积输出。左边利用接步长为2的3x3平均池化进行下采样,然后将两边连接起来再接Relu激活。
对不同scale和分组数的性能
不同channel shuffle对不同网络大小作用
ShuffleNet与MobileNet在ImageNet分类的结果比较
作为目标检测主干网络在COCO数据集上的结果对比