MobileNet V1 模型总结

MobileNet 主要解决模型在应用端的参数大小,延迟,以及训练时间的问题。

MobileNet 的主要贡献包括:
  • 提出depthwise separable convolution代替传统的convolution layer,将卷积操作的计算量降为原始的 1 N + 1 D K 2 \frac{1}{N}+\frac{1}{D_K^2} N1+DK21 ,其中 D K D_K DK表示卷积核的大小, N N N表示卷积输出的feature map的通道数。
  • 在上一步的基础上,为了进一步精简模型的参数和加速训练时间,提出width multiplier 和resolution multiplier,前者降低卷积操作的输入特征,输出特征的通道数,后者降低输入特征的分辨率。比如一个卷积层的输入特征是 M ∗ D F ∗ D F M*D_F*D_F MDFDF M M M表示输入层的通道数, D F ∗ D F D_F*D_F DFDF分别表示特征的长和宽。那么width multiplier的作用是将 M M M降低为 α ∗ M \alpha*M αM,resolution multiplier的作用是将分辨率降为 ( ρ ∗ D F ) ∗ ( ρ ∗ D F ) (\rho*D_F)*(\rho*D_F) (ρDF)(ρDF)= ρ 2 ∗ D F ∗ D F \rho^2*D_F*D_F ρ2DFDF
Depthwise Seprable convolution原理

我们先考虑一下一次普通卷积对应的计算量的大小:
假设输入特征是 M ∗ D F ∗ D F M*D_F*D_F MDFDF,卷积核的kernel size是 D K ∗ D K D_K*D_K DKDK,卷积输出层对应的特征是 N ∗ D F ∗ D F N*D_F*D_F NDFDF,那么这次卷积操作的运算量是: N ∗ D F ∗ D F ∗ D K ∗ D K ∗ M N*D_F*D_F*D_K*D_K*M NDFDFDKDKM

原因是:我们可以这么理解,对于输出层的特征的每一个pixel,他都是由 D K ∗ D K D_K*D_K DKDK的卷积核在输出的M个通道上相同位置卷积之后线性变换得到的。由于输出层具有 N ∗ D F ∗ D F N*D_F*D_F NDFDF个pixel,每个pixel是输入层以 D K ∗ D K D_K*D_K DKDK的滑动窗口在M个通道上计算然后线性变换得到,所以计算单个pixel所需要的计算量就是 D K ∗ D K ∗ M D_K*D_K*M DKDKM次,所以输出层的特征共需计算: N ∗ D F ∗ D F ∗ D K ∗ D K ∗ M N*D_F*D_F*D_K*D_K*M NDFDFDKDKM次。

即单次卷积计算量只与输出层的feture数量,卷积核的大小,输入层的通道数有关。

那么上面的卷积过程可以怎么优化呢?上面的卷积过程可以看成两步:

  • 在输入层给定pixel的 D K ∗ D K D_K*D_K DKDK邻域内进行一次卷积操作,然后在 M M M个通道上做类似的操作,会得到 M ∗ 1 M*1 M1条特征
  • 对于输出层的给定pixel可以由这M条特征线性加权得到

那么对于第一步,我们可以采用depthwise convolution,具体而言:输入层的特征维度为 M ∗ D F ∗ D F M*D_F*D_F MDFDF,这时候我们按通道卷积,即固定每个chanell, 输出层的特征大小为 M ∗ D F ∗ D F M*D_F*D_F MDFDF,虽然前后特征大小相同,但是此时输出层的每个pixel的特征**仅仅是由输入层对应通道的pixel周围的 D K ∗ D K D_K*D_K DKDK**邻域的值卷积得到。需要计算量: M ∗ D F ∗ D F ∗ D K ∗ D K M*D_F*D_F*D_K*D_K MDFDFDKDK

对于第二步,可以看成是利用pointwise convolution进行特征降维,具体而言:由于第一步得到的输出层的特征 M ∗ D F ∗ D F M*D_F*D_F MDFDF,利用pointwise convolution将其降维成 N ∗ D F ∗ D F N*D_F*D_F NDFDF,此时输出层的每个pixel可以看成是输入层M个通道对应pixel位置的值进行线性加权。需要计算量: N ∗ D F ∗ D F ∗ M N*D_F*D_F*M NDFDFM

简而言之:depthwise convolution固定通道,在固定通道的pixel的周围 D K ∗ D K D_K*D_K DKDK邻域进行卷积;pointwise convolution固定分辨率,每个pixel由上一步的M个通道进行线性加权得到

那么把卷积操作分解成这两步操作对应的计算量: M ∗ D F ∗ D F ∗ D K ∗ D K M*D_F*D_F*D_K*D_K MDFDFDKDK+ N ∗ D F ∗ D F ∗ M N*D_F*D_F*M NDFDFM

与简化之前的卷积计算量对比为: M ∗ D F ∗ D F ∗ D K ∗ D K + N ∗ D F ∗ D F ∗ M N ∗ D F ∗ D F ∗ D K ∗ D K ∗ M \frac{M*D_F*D_F*D_K*D_K+N*D_F*D_F*M}{N*D_F*D_F*D_K*D_K*M} NDFDFDKDKMMDFDFDKDK+NDFDFM= 1 N + 1 D K 2 \frac{1}{N}+\frac{1}{D_K^2} N1+DK21

width multiplier 和resolution multiplier

前者主要针对输入和输出特征的通道数,将计算量降低至: α M ∗ D F ∗ D F ∗ D K ∗ D K + α N ∗ D F ∗ D F ∗ α M \alpha M*D_F*D_F*D_K*D_K+\alpha N*D_F*D_F*\alpha M αMDFDFDKDK+αNDFDFαM,即 M → α M M \rightarrow \alpha M MαM N → α N N \rightarrow \alpha N NαN
后者主要针对输出特征分辨率进行降低计算量: M ∗ ρ D F ∗ ρ D F ∗ D K ∗ D K + N ∗ ρ D F ∗ ρ D F ∗ M M*\rho D_F*\rho D_F*D_K*D_K+N*\rho D_F*\rho D_F*M MρDFρDFDKDK+NρDFρDFM,即 D F → ρ D F D_F \rightarrow \rho D_F DFρDF

MobileNet pytorch 版本
https://github.com/jmjeon94/MobileNet-Pytorch/blob/master/MobileNetV1.py

posted @ 2020-12-13 21:05  xzhws  阅读(278)  评论(0编辑  收藏  举报