《MobileNetV2: Inverted Residuals and Linear Bottlenecks》_程大海的博客-CSDN博客
《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》_程大海的博客-CSDN博客
pytorch中MobileNetV2分类模型的源码注解_程大海的博客-CSDN博客
pytorch卷积操作nn.Conv中的groups参数用法解释_程大海的博客-CSDN博客_pytorch中groups
开源代码:https://github.com/xxcheng0708/Pytorch_Image_Classifier_Template
在MobileNet之前,提升模型推理效率常用的方法是模型压缩(量化、剪枝等)和知识蒸馏(Teacher-Student网络)。
核心概念:
深度可分离卷积(deep-wise separable convolution):深度可分离卷积将标准卷积操作分解为一个深度卷积(deepwise convolution)和一个1x1的卷积(pointwise convolution).对于深度卷积(deepwise convolution),对于每个输入通道使用一个卷积核,也就是采用分组卷积的方式,分组卷积参考pytorch卷积操作nn.Conv中的groups参数用法解释。然后使用1x1的卷积将上一步分组卷积得到的结果进行combine。
假设输入的特征图feature_map大小为[H, W, M],深度可分离卷积第一步使用M组KxKx1的卷积核对每个输入通道in_channel进行卷积,卷积输出结果特征图feature_map大小为[H, W, M],然后使用N个1x1xM的卷积核进行卷积操作,输出的特征图大小为[H, W, N]。深度可分离卷积的目的是减少卷积操作的参数量和计算量,从而提升运算速度。深度可分离卷积表示如下图:
备注:上图中的(N,H,W,N)中,第一个N表示batch_size,最后一个N表示深度可分离卷积第二步1x1之后的输出通道数。
标准卷积与深度可分离卷积结构对比:
MobileNetV1网络结构(共28层卷积层):
MobileNetV1参数量个计算量分布:
通过上图可看到,将标准卷积转换为深度可分离卷积之后,网络的参数量和计算量确实都下降了,但是此时1x1卷积的参数量和计算量占了绝对的大头,如果能对1x1卷积部分再进一步优化岂不是更好,这也正是ShuffleNetV1要做的事情。
模型容量(capacity)缩放参数:
Width宽度缩放(控制channel数):MobileNetV1中引入超参数来控制网络宽度width(每层卷积的输出通道数),假设引入这个参数之前的输出通道数为C,则引入之后的输出通道数为。引入参数之后深度可分离卷积的浮点数计算量为:
Resolution分辨率缩放(控制输入分辨率大小): MobileNetV1中引入超参数来控制网络的输入图像分辨率大小。引入参数之后深度可分离卷积的浮点数计算量为:
备注:对于2D卷积网络常见的模型缩放参数包括输入分辨率resolution、width(卷积输出通道数)、depth(网络的层数)、bottleneck(参见X3D模型缩放参数),具体可以参考EfficientNet网络模型。对于3D卷积网络常见的模型缩放参数包括时间分辨率resolution、width(卷积输出通道数)、depth(网络的层数)、bottleneck(参见X3D模型缩放参数)、输入时间维度大小,具体可以参考X3D网络模型。
标准卷积、深度可分离卷积、分辨率缩放、width缩放模型参数和计算量比对: