[轻量化网络]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. 对比

对比

通过对比,深度可分离卷积的参数量和计算量均为原来的:

image

DK为卷积核尺寸,一般用的是3*3的卷积核,因此会下降到原来的1/9到1/8之间。

 

3. MobileNet V1推断加速的其他因素

首先看看mobilenetv1的计算资源分布:

计算量和参数量分布

可以看到95%的计算量都在1*1卷积上,因此如果想要加速推断速度,就必须优化1*1卷积的推断速度。

一般来说,普通卷积会先把输入特征图转为一个特征图矩阵,然后再与卷积核矩阵进行相乘,这个过程称为im2col:

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

(完)

posted @ 2022-09-19 19:31  大师兄啊哈  阅读(1013)  评论(0编辑  收藏  举报