MobileNet是2017年由Google提出的一个应用于移动端和嵌入式的卷积神经网络。它的主要应用场景包括有智能手机、无人机、机器人、自动驾驶、增强现实等等。
在这之前,研究者更多还是关注于精度的提升,模型也是朝着深度更深、结构更复杂的方向发展。从最初12年提出的8层的AlexNet、再到14年各领风骚的19层的VGG和22层的GoogLeNet、再到15年何凯明大神提出的152层的ResNet。可见,深度是越来越深,精度是越来越高。
但与此同时,这些网络的参数和计算量也是足够的大,很难在移动端和嵌入式设备中使用。
本文介绍的MobileNet就是一个针对移动端、参数量和计算量都大幅减小,同时精度很高的一个高效卷积神经网络。
我对MobileNet的总结是八个字: 一点创新,两个超参。
1 一点创新
那么MobileNet 有哪些创新之处呢?
其实最主要的创新就只有一点。那就是采用了depthwise separable convolution, 中文叫法是深度可分离卷积。
如果之前没听过,听这个名字感觉很高大上的样子。其实如果你了解标准的卷积操作,那么了解它也是很容易的事情。
如上图所示,这是一张标准卷积的示意图。我们看到一个标准的卷积操作中既包含对输入特征图的过滤,又包含基于通道方向的组合。
深度可分离卷积所做的就是对标准卷积的分解,分解为一个depthwise convolution 和一个pointwise convolution 。(下文中,分别称之为DW卷积和PW卷积)
也即是说,在MobileNet的网络中不再使用标准卷积,而是采用这两个DW卷积和PW卷积来代替。
那么,什么是DW卷积和PW卷积呢?
1.1 DW卷积
这是DW卷积的示意图。我们看到,它的卷积核个数和输入特征图的通道个数一致(上图中均是4个),每个卷积核只有一个通道,作用于输入特征图的对应深度上。
它与标准卷积不同的是:在标准卷积中,每个卷积核的通道数是与输入特征图的通道数一致的,每个卷积核都与输入特征图在空间宽度、高度和深度上进行过滤和组合,并形成一张特征图;且有N个这样的卷积核,最终形成的输出特征图也就是通道数为N的特征图。
而DW卷积,明显简化了许多。它的一个卷积核只有单个通道,只负责输入特征图深度方向的一层特征图。这样很明显参数量会大大减少。(在下一节中会给出具体数据)
仅仅只有depthwise convolution是不够的,因为它只实现了对输入特征图宽度和高度的过滤操作,并没有对通道方向进行组合。因此我们还需要一个组合的操作。这便是PW卷积要做的事情。
1.2 PW卷积
PW卷积就是普通的1*1卷积。
我们之前介绍过,1*1卷积实现了对输入特征图在通道方向上的加权组合,来生成新的特征图。并根据卷积核的个数的多少,决定输出特征图的通道数。
因此,我们这里就使用一个1*1卷积,来对DW卷积的输出结果在通道方向进行线性的组合。
如下图所示,可以看到和标准卷积的区别,只是卷积核变为了1*1的大小。
1.3 对比标准卷积与深度可分离卷积的计算量
接下来,我们分析一下,采用DW卷积和PW卷积组合的这种深度可分离卷积,是如何大幅度减少网络参数的。
我们不妨设输入的特征图大小为 D F ∗ D F ∗ M D_F * D_F *M DF∗DF∗M,其中 D F D_F DF表示输入特征图的空间宽度和高度, M M M表示输入特征图的通道数(深度);
假设卷积核大小为 D K ∗ D K ∗ M ∗ N D_K * D_K * M * N DK∗DK∗M∗N,其中 D K D_K DK表示卷积核的空间宽度和高度, M M M表示输入特征图的通道数,N表示卷积核的个数; 且卷积核的步距stride=1,采用same padding的填充方式。
那么一个标准卷积计算量是:
D K ∗ D K ∗ M ∗ N