CNN 模型压缩方法

MobileNetV1

Google Howard 等人提出的适用于移动设备的,使用 depthwise separable conv 构建的轻量 CNN。

引入了两个全局超参数,能够有效地平衡了速度和准确率。超参数允许模型构建者根据他们的问题,选择模型大小。

Depthwise Seperable Conv

这种卷积用两层结构,替代了标准卷积,加速计算:

  1. depthwise conv:一个 filter 只过滤一层 feature map(标准卷积是所有层)。

  2. pointwise conv:1x1 卷积,输出结果到下一层。

depthwise conv

简单地说,depthwise conv 把标准卷积的求和步骤,放到了第二步 1x1 conv 来做。

标准卷积输入 DF×DF×MD_F \times D_F \times M 的特征 map,输出 DG×DG×ND_G \times D_G \times N 的 feature map,其中 M 是输入深度,N 是输出深度,DF,DGD_F,D_G 是输入输出 feature map 的宽高。标准卷积的算法:

Gk,l,n=i,j,mKi,j,m,nFk+i1,l+j1,mG_{k,l,n} = \sum_{i,j,m}{K_{i,j,m,n} \cdot F_{k+i-1, l+j-1,m}}

标准卷积的计算复杂度:

DKDKMNDFDFD_K \cdot D_K \cdot M \cdot N \cdot D_F \cdot D_F

其中 M 是输入通道数,N 是输出通道数,DK×DKD_K \times D_K 是 kernel size,DF×DFD_F \times D_F 是 feature map size。

而 depthwise 卷积的算法:

G^k,l,m=i,jK^i,j,mFk+i1,l+j1,m\hat{G}_{k,l,m} = \sum_{i,j}{\hat{K}_{i,j,m} \cdot F_{k+i-1, l+j-1,m}}

计算复杂度:

DKDKMDFDFD_K \cdot D_K \cdot M \cdot D_F \cdot D_F

depthwise 卷积加上 1x1 卷积,计算复杂度:

DKDKMDFDF+MNDFDFD_K \cdot D_K \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F

二者相除,这种卷积计算复杂度减少了:

1N+1DK2\frac{1}{N} + \frac{1}{D_K^2}

其中,MobileNet 使用 3x3 卷积,可以提速 8~9 倍,同时对准确率影响不大。

超参数

宽度超参数 α(0,1]\alpha \in (0,1],把输入输出 M,NM, N 变成 αM,αN\alpha M, \alpha N。通过设置 α\alpha,参数尺寸可以缩减约 α2\alpha^2

分辨率超参数 ρ(0,1]\rho \in (0,1],把 feature map DFDFD_F \cdot D_F 变成 ρDFρDF\rho D_F \cdot \rho D_F。通过设置 ρ\rho,计算量可以缩减约 ρ2\rho^2

MobileNetV2

引入的新的网络结构:inverted residual with linear bottleneck

与 resnet 不同,输入层先用 conv 1x1 降维,在使用 Dwise conv 3x3 + Pointwise 1x1 代替原先的标准卷积。

与 MobileNetV1 bottleneck 使用非线性函数 ReLU 不同,linear bottleneck 输出层使用线性函数 conv 1x1。原因是:理论上,ReLU 在高维空间能有效增加非线性,但在低维空间(Depthwise Conv 后)会丢失信息,参见论文附录A;实验上,导致准确率损失。

Dwise 使用 ReLU6,当低精度运算时有更好的鲁棒性。

v2

MobileNetV2 的 Keras 实现可参考: github

SqueezeNet 17’

TODO

本文有帮助?