MobileNet V1 模型总结

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

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

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

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

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

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

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

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

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

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

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

与简化之前的卷积计算量对比为: 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} N∗DF​∗DF​∗DK​∗DK​∗MM∗DF​∗DF​∗DK​∗DK​+N∗DF​∗DF​∗M​= 1 N + 1 D K 2 \frac{1}{N}+\frac{1}{D_K^2} N1​+DK2​1​

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 αM∗DF​∗DF​∗DK​∗DK​+αN∗DF​∗DF​∗α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​∗ρDF​∗DK​∗DK​+N∗ρDF​∗ρDF​∗M,即 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  阅读(394)  评论(0)    收藏  举报