[轻量化网络]MobileNet V1学习笔记
1. MobileNet V1的核心是什么
MobileNetV1最重要的就是把VGG中的标准卷积层换成深度可分离卷积(Depthwise Separable Convolution),通过这种手段大量降低模型的参数量和计算量,同时并没有降低太多的模型性能,从而达到为模型加速的目的。
2. 为什么深度可分离卷积可以节省计算量
2.1. 标准卷积
在标准卷积中,输入有多少通道,filter就需要有多少个通道,如输入一个12*12*3的特征图,经过5*5*3的filter,得到一个8*8*1的输出特征图,如果我们有256个filter,则最终可以得到8*8*256的输出特征图。
2.2. 深度可分离卷积
深度可分离卷积由深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)组成。
2.2.1. 深度卷积
深度卷积是分组卷积的一种特殊情况,每个filter只有一个通道, 只对对应的输入通道进行卷积操作,如输入12*12*3的特征图,经过5*5*1*3的深度卷积,得到8*8*3的输出特征图。但是这个时候,输入和输出的通道数就无法改变,需要通过逐点卷积进行升维。
2.2.2. 逐点卷积
其实就是1*1卷积,主要作用是对特征图进行升维或者降维。
如在刚才的8*8*3的特征图上,使用256个1*1*3的filter进行卷积,可以得到8*8*256的输出特征图。
2.3. 标准卷积与深度可分离卷积对比
2.3.1. 标准卷积参数及计算量
标准卷积参数量:
卷积核的尺寸为DK*DK*M,数量为N个,因此参数量为
DK*DK*M*N
标准卷积计算量:
由卷积的特性可以知道输出特征图的大小即为每个filter进行卷积运算的次数,为DW*DH。
而每次卷积进行的计算次数等于filter的尺寸(只算乘法),为DK*DK*M,总共有N个filter,因此总共的计算量为:
DK*DK*M*N*DW*DH
2.3.2. 深度可分离卷积参数及计算量
参数量:
深度卷积:filter尺寸为DK*DK*1,有M个,参数量为DK*DK*M。
逐点卷积:filter尺寸为1*1*M,有N个,参数量为M*N。
总参数量为:DK*DK*M + M*N。
计算量:
深度卷积:filter尺寸为DK*DK*1,有M个,每个filter需要做DH*DW次运算,计算量为DK*DK*M*DH*DW。
逐点卷积:filter尺寸为1*1*M,有N个,每个filter需要做DH*DW次运算,计算量为M*N*DH*DW。
总计算量为:DK*DK*M*DH*DW+M*N*DH*DW
2.3.3. 对比
通过对比,深度可分离卷积的参数量和计算量均为原来的:
DK为卷积核尺寸,一般用的是3*3的卷积核,因此会下降到原来的1/9到1/8之间。
3. MobileNet V1推断加速的其他因素
首先看看mobilenetv1的计算资源分布:
可以看到95%的计算量都在1*1卷积上,因此如果想要加速推断速度,就必须优化1*1卷积的推断速度。
一般来说,普通卷积会先把输入特征图转为一个特征图矩阵,然后再与卷积核矩阵进行相乘,这个过程称为im2col:
然后计算矩阵相乘的时候使用GEMM库进行加速计算,从而完成对卷积的加速计算。
然而1*1卷积过程天然就是两个矩阵相乘,因此省去了im2col这个过程,大大节省了数据重排的时间和空间,因此计算起来更加快速。
然而MobileNetV1在GPU上加速效果并没有CPU上那么明显,对此网上有文章进行分析,主要两个原因:
因为GPU加速主要是在同一层并行计算,层与层之间还是需要串行计算,因此MobileNetV1没有放弃深度(28层),因此在计算加速上有限。
另外是GEMM算法,在CPU上计算1*1卷积的时候,在内存上更容易命中寄存器,从而为计算加速。
4. 参考
[1] 轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3
[2] 视频,同济子豪兄,【精读AI论文】谷歌轻量化网络MobileNet V1
[3] 论文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Application
(完)