【AI不惑境】移动端高效网络,卷积拆分和分组的精髓

你们好,这是专栏《AI不惑境》的第六篇文章,讲述卷积拆分和分组卷积的精髓。python

进入到不惑境界,就是向高手迈进的开始了,在这个境界须要本身独立思考。若是说学习是一个从模仿,到追随,到创造的过程,那么到这个阶段,应该跃过了模仿和追随的阶段,进入了创造的阶段。从这个境界开始,讲述的问题可能再也不有答案,更多的是激发你们一块儿来思考。git

做者&编辑 | 言有三shell

在移动端高效的模型设计中,卷积拆分和分组几乎是不可缺乏的思想,那么它们到底是如何高效,自己又有哪些发展呢。vim

 

1 什么是卷积拆分windows

一个多通道的普通2D卷积包含了三个维度,分别是通道,长,宽,以下图(a)。网络

 

而后将这个卷积的步骤分解为3个独立的方向[1],即通道方向,X方向和Y方向,如上图(b),则具备更低的计算量和参数量。app

假如X是卷积核宽度,Y是卷积核高度,C是输入通道数,若是是正常的卷积,那么输出一个通道,须要的参数量是XYC,通过上图的分解后,参数量变为X+Y+C,通常来讲C>>X和Y,因此分解后的参数对比以前的参数约为1/(XY)。函数

对于3×3的卷积,至关于参数量下降一个数量级,计算量也是至关,可见这是很高效的操做。性能

固然,还能够只分解其中的某些维度,好比在Inception V3的网络结构中,就将7×7的卷积拆分为1×7和7×1两个方向。从另外一个角度来看,这还提高了网络的深度。学习

 

2 什么是通道分组

2.1 分组卷积的来源

标准的卷积是使用多个卷积核在输入的全部通道上分别卷积提取特征,而分组卷积,就是将通道进行分组,组与组之间相关不影响,各自获得输出。

通道分组的思想来自于Laurent Sifre在Google实习的时候提出的separable convolution,相关的内部报告能够参考YouTube视频https://www.youtube.com/watch?v=VhLe-u0M1a8,具体的实如今它的博士论文[2]中,以下示意图。

 

对于平移,旋转等刚体运动来讲,它们能够被拆分红不一样的维度,所以使用上面的separable convolution,实现起来也很简单,就是先进行通道的分组,这在AlexNet网络中还被看成一个训练技巧。

2.2 从Xception到MobileNet

随着Google的Inception网络提出,这一个相对于VGG更加高效的网络也开始进化。到了Inception V2的时候,已经用上了上面的思想。

 

上面就是一个与Inception Module相似的模块,只是每个通道彻底同样,这就能够等价于通道分组了。

假如分组的个数与输入通道数相等,Inception便成为了极致的inception(extreme inception,简称Xception[3])。

首先通过1×1卷积,而后通道分组进行卷积,这样的一个结构随Tensorflow的流行而流行,名为Depthwise Separable Convolution。

随后Google的研究人员提出了MobileNets[4]结构,使用了Depthwise Separable Convolution模块进行堆叠,与Xception中的不一样是1×1卷积放置在分组卷积以后。由于有许多这样的模块进行堆叠,因此二者实际上是等价的。

画成二维图,示意图以下:

 

画成三维图,示意图以下:

使用Netscope可视化MobileNet的网络以下,当咱们看到这个28层的网络,又经历了残差网络的洗礼后,顿时有种返璞归真的感受。

2.3 分组卷积性能如何

令输入blob大小为M×Dk×Dk,输出为N×Dj×Dj,则标准卷积计算量为M×Dk×Dk×N×Dj×Dj,而转换为Depthwise卷积加Pointwise卷积,Depthwise卷积计算量为M×Dk×Dk×Dj×Dj,Pointwise卷积计算量为M×N×Dj×Dj,计算量对比为:(M×Dk×Dk×Dj×Dj+M×N×Dj×Dj)/M×Dk×Dk×N×Dj×Dj= 1/N+1/(Dk×Dk),因为网络中大量地使用3×3的卷积核,当N比较大时,上面卷积计算量约为普通卷积的1/9,从而下降了一个数量级的计算量。

性能上也没有让咱们失望,在只有VGG16不到1/32的参数量和1/27的计算量的同时还能取得与之至关的性能。

 

关于更多细节的解读和实验对比,此处就再也不作介绍了,能够阅读之前的一篇文章。

【模型解读】说说移动端基准模型MobileNets

2.4 分组卷积性能的进一步提高

对于MobileNet这样的网络结构,还能够从两个方向进行提高,第一个是增长分组的信息交流,第二个是更加智能的分组。

简单的分组使得不一样通道之间没有交流,可能会致使信息的丢失,Shufflenet[5]从新增长了通道的信息交换。具体来讲,对于上一层输出的通道,先作一个Shuffle操做,再分红几个组进入到下一层,示意图以下:

另外一方面,MobileNet的分组是固定,ShuffleNet中的通道的打乱也是一个肯定的映射,那是否是能够基于数据来学习到更加合适的分组呢?Condensenets[6]给出了肯定的回答。

更多的解读,咱们已经放在了知识星球中,感兴趣的能够关注。

 

3 分组卷积结构的发展

ResNet虽然不是残差链接的发明者,但使得这一思想为众人痴狂。MobileNet也不是分组卷积的发明者,但一样是它使分组的思想深刻人心,原来这样的网络结构不只不下降准确率,还能大幅度提高计算效率,尤为适合硬件并行。

自此,分组的思想被不断拓展研究,下面咱们主要考虑分组的各个通道存在较大差别的研究。

3.1 多分辨率卷积核通道分组网络

这一类网络以SqueezeNet[7]为表明,它以卷积层conv1开始,接着是8个Fire modules,最后以卷积层conv10结束。

一个fire module的子结构下图,包含一个squeeze模块加上一个expand模块。Squeeze模块使用1×1卷积进行通道降维,expand模块使用1×1卷积和3×3卷积用于通道升维。

Squeezenet的压缩比率是惊人的,只有AlexNet 1/50的参数量,能达到至关的性能。

3.2 多尺度通道分组网络

这一类结构采用不一样的尺度对信息进行处理,对于分辨率大的分支,使用更少的卷积通道,对于分辨率小的分支,使用更多的卷积通道,以Big-Little Net[8]为表明,K个分支,尺度分别为1/2^(K-1),以下图结构。

固然,若是两个通道在中间的计算过程当中还存在信息的交流,则能够得到更高的性能,好比Octave Convolution[9]。

 

卷积核经过因子被分为了高分辨率和低分辨率两部分,低分辨率具备较多的通道,被称为低频份量。高分辨率具备较少的通道,被称为高频份量,二者各自学习,而且进行信息的融合。高分辨率通道经过池化与低分辨率通道融合,低分辨率经过上采样与高分辨率通道融合。最终在22.2GFLOPS的计算量下,ImageNet Top-1的精度达到了82.9%。

3.3 多精度通道分组网络

除了还分辨率和卷积核上作文章,还能够在计算精度上作文章,这一类结构以DSConv[10]为表明,它将卷积核分为两部分,一部分是整数份量VQK,一部分是分数份量KDS,以下图:

VQK(Variable Quantizes Kernel)只有整数值,不可训练,它的权重值从预训练模型中计算而来。KDS(kernel distribution shifter)是浮点数,包含一个kernel级别的偏移量,一个channel级别的偏移量。

这一个模型在ResNet50和ResNet34,AlexNet,MobileNet等基准模型上取得了14x参数量的压缩,10x速度的提高。

除了上面这些思路外,还有不少能够作的空间,你们能够去多实验写论文填坑,有三就帮到这里了。

参考文献

[1] Jin J, Dundar A, Culurciello E. Flattened convolutional neural networks for feedforward acceleration[J]. arXiv preprint arXiv:1412.5474, 2014.

[2] Sifre L , Mallat, Stéphane. Rigid-Motion Scattering for Texture Classification[J]. Computer Science, 2014.

[3] Chollet F. Xception: Deep Learning with Depthwise Separable Convolutions[J]. computer vision and pattern recognition, 2017: 1800-1807.

[4] Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017.

[5] Zhang X, Zhou X, Lin M, et al. Shufflenet: An extremely efficient convolutional neural network for mobile devices[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 6848-6856.

[6] Huang G, Liu S, Van der Maaten L, et al. Condensenet: An efficient densenet using learned group convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2752-2761.

[7] Iandola F N, Han S, Moskewicz M W, et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size[J]. arXiv preprint arXiv:1602.07360, 2016.

[8] Chen C F, Fan Q, Mallinar N, et al. Big-little net: An efficient multi-scale feature representation for visual and speech recognition[J]. arXiv preprint arXiv:1807.03848, 2018.

[9] Chen Y, Fang H, Xu B, et al. Drop an octave: Reducing spatial redundancy in convolutional neural networks with octave convolution[J]. arXiv preprint arXiv:1904.05049, 2019.

[10] Gennari M, Fawcett R, Prisacariu V A. DSConv: Efficient Convolution Operator[J]. arXiv preprint arXiv:1901.01928, 2019.

总结

分组卷积之全部有效,一个是由于网络中的空间和通道的冗余计算使得其性能能够保持,而简单的分组并行计算又很是适合于GPU等处理器,所以在移动端高效率模型中普遍使用,是必须掌握的思想。

下期预告:深度学习中的尺度。

AI白身境系列完整阅读:

第一期:【AI白身境】深度学习从弃用windows开始

第二期:【AI白身境】Linux干活三板斧,shell、vim和git

第三期:【AI白身境】学AI必备的python基础

第四期:【AI白身境】深度学习必备图像基础

第五期:【AI白身境】搞计算机视觉必备的OpenCV入门基础

第六期:【AI白身境】只会用Python?g++,CMake和Makefile了解一下

第七期:【AI白身境】学深度学习你不得不知的爬虫基础

第八期: 【AI白身境】深度学习中的数据可视化

第九期:【AI白身境】入行AI须要什么数学基础:左手矩阵论,右手微积分

第十期:【AI白身境】一文览尽计算机视觉研究方向

第十一期:【AI白身境】AI+,都加在哪些应用领域了

第十二期:【AI白身境】究竟谁是paper之王,全球前10的计算机科学家

AI初识境系列完整阅读

第一期:【AI初识境】从3次人工智能潮起潮落提及

第二期:【AI初识境】从头理解神经网络-内行与外行的分水岭

第三期:【AI初识境】近20年深度学习在图像领域的重要进展节点

第四期:【AI初识境】激活函数:从人工设计到自动搜索

第五期:【AI初识境】什么是深度学习成功的开始?参数初始化

第六期:【AI初识境】深度学习模型中的Normalization,你懂了多少?

第七期:【AI初识境】为了围剿SGD你们这些年想过的那十几招

第八期:【AI初识境】被Hinton,DeepMind和斯坦福嫌弃的池化,究竟是什么?

第九期:【AI初识境】如何增长深度学习模型的泛化能力

第十期:【AI初识境】深度学习模型评估,从图像分类到生成模型

第十一期:【AI初识境】深度学习中经常使用的损失函数有哪些?

第十二期:【AI初识境】给深度学习新手开始项目时的10条建议

AI不惑境系列完整阅读:

第一期:【AI不惑境】数据压榨有多狠,人工智能就有多成功

第二期:【AI不惑境】网络深度对深度学习模型性能有什么影响?

第三期:【AI不惑境】网络的宽度如何影响深度学习模型的性能?

第四期:【AI不惑境】学习率和batchsize如何影响模型的性能?

第五期:【AI不惑境】残差网络的前世此生与原理

第六期:【AI不惑境】移动端高效网络,卷积拆分和分组的精髓

感谢各位看官的耐心阅读,不足之处但愿多多指教。后续内容将会不按期奉上,欢迎你们关注有三公众号 有三AI