网络加速作为算法的下游核心,那么为什么要网络加速?对应又有那么操作点?我们先来个概况性的框架。我建议学习新知识或总结归纳知识的时候,一定要有个总分总逻辑性的学习过程。
• 轻量化网络结构设计
• 蒸馏
• 低秩分解等
• 剪枝
• 蒸馏
• 定点化
• TensorRT
《MobileNetv1: Efficient Convolutional Neural Networks for Mobile Vision Applications》
论文下载:
公众号回复:MobileNet v1
这是2017年由谷歌提出,至今引用量 7000+,这引用量,我没认真统计过哈,应该前十是排的上的吧,所以这篇17年的文章不要觉得过时,经典性的文章,或许有些技巧不怎么用了,但是核心思想!!核心思想一定是可以推敲学习的。
DSC包含两部分:depthwise convolution(DWC)+ pointwise convolution(PWC)。DWC对输入的通道进行滤波,其不增加通道的数量,PWC用于将PWC不同的通道进行连接,其可以增加通道的数量。通过这种分解的方式,可以明显的减少计算量。
如下图所示,传统的卷积(a),卷积核参数为DK⋅DK⋅M⋅NDK⋅DK⋅M⋅N,其中DKDK为卷积核大小,M为输入的通道数,N为输出的通道数。DWC(b)中卷积核参数为DK⋅DK⋅1⋅MDK⋅DK⋅1⋅M,其中M个DK⋅DKDK⋅DK的核和输入特征的对应通道进行卷积,如下式所示。PWC(c)中卷积核参数为1⋅1⋅M⋅N1⋅1⋅M⋅N,每个卷积核在特征维度上分别对输入的M个特征进行加权,最终得到N个特征(M≠N时,完成了升维或者降维)。
Gk,l,m=∑i,jKk,l,m⋅Fk+i−1,l+j−1,mGk,l,m=∑i,jKk,l,m⋅Fk+i−1,l+j−1,m
DK⋅DK⋅M⋅N⋅DF⋅DFDK⋅DK⋅M⋅N⋅DF⋅DF
DK⋅DK⋅M⋅DF⋅DF+M⋅N⋅DF⋅DFDK⋅DK⋅M⋅DF⋅DF+M⋅N⋅DF⋅DF
当使用3*3的卷积核时,DSC可将计算量降低为原来的1/8到1/9。
需要说明的是,DWC,PWC后面均有BN和ReLU。如下图所示,传统的卷积层为33conv+BN+ReLU,Depthwise Separable convolutions为33DWC+BN+ReLU+1*1conv+BN+ReLU。
1x1的卷积,它的im2col非常特殊——其原始存储结构跟im2col的重排列矩阵是完全相同的!也就是说,1x1卷积甚至不需要im2col的过程,拿起来就能直接算,节省了数据重排列的时间和空间,所以哪怕是在相同FLOPs的前提下,1x1卷积也要比3x3卷积快速、高效得多。
当然,这是建立在局部性原理和冯诺依曼结构的基础之上,对于非冯结构的计算体系可能就不适用了。
这也是为什么MobileNet在论文最后要强调说他94.86%的运算量都集中1x1的卷积运算上,它的快速可不仅仅体现在“少参数,少运算量”上!
mobileNetV1的网络结构如下图所示。其中第一个卷积层为传统的卷积;前面的卷积层均有bn和relu,最后一个全连接层只有BN,无ReLU。
文中引入了α作为宽度缩放因子,其作用是在整体上对网络的每一层维度(特征数量)进行瘦身。α影响模型的参数数量及前向计算时的乘加次数。此时网络每一层的输入为αMαM维,输出为αNαN维。此时DSC的计算量变为:
DK⋅DK⋅αM⋅DF⋅DF+αM⋅αN⋅DF⋅DFDK⋅DK⋅αM⋅DF⋅DF+αM⋅αN⋅DF⋅DF
α∈(0,1],典型值为1,0.75,0.5,0.25。
该因子即为ρ,用于降低输入图像的分辨率(如将224224降低到192192,160160,128128)。
此时DSC的计算量变为:
DK⋅DK⋅αM⋅ρDF⋅ρDF+αM⋅αN⋅ρDF⋅ρDF
在一系列视觉任务如ImageNet分类、细粒度分类、目标检测等等上,显著降低模型大小的同时也取得了不错的效果。
1.6.1 MobileNet v1的结构过于简单,是类似于VGG的直筒结构,导致这个网络的性价比其实不高。如果引入后续的一系列ResNet、DenseNet等结构(复用图像特征,添加shortcuts)可以大幅提升网络的性能。
1.6.2 Depthwise Convolution存在潜在问题,训练后部分kernel的权值为0。