随着AlexNet 在2012年ImageNet 竞赛中赢得冠军之后,卷积神经网络在计算机视觉领域已开始变得无处不在。一个大的研究趋势是研究更深、更复杂的网络,从而实现更高的准确率。但这些提升准确率的改进并不一定会使网络在大小和速度上更加高效。
然而在许多现实世界的应用中,比如智能手机、机器人、无人机、自动驾驶、增强现实等,图像识别任务需要在计算资源受限的平台上高效的执行。
为此,出现了很多研究针对移动端与嵌入式设备上应用的小型高效的网络,比如MobileNetV1、MobileNetV2、ShuffleNetV1、ShuffleNetV2等。
为了后续更加深入的理解这些高效而准确的网络,本文先做一个铺垫,介绍这些网络中最常使用的卷积操作。当我们将这些不同类型的卷积操作以及它们之间的关系、它们的计算量的对比了解清楚,我们在读这些论文时才更容易真正明白为什么这些网络是小型且高效的。
我们从卷积的一般到特例,下文分别逐一介绍
假设输入的特征图大小为 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 F ∗ D F ∗ N D_F * D_F * N DF∗DF∗N。整个过程如下图所示。
根据以上的卷积过程,我们知道普通的convolution操作有两个特点:
我们计算得到一个普通的convolution的计算量是 D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F D_K * D_K * M * N * D_F * D_F DK∗DK∗M∗N∗DF∗DF。其中$D_K * D_K * M $ 是计算得到输出特征图中的一个点的计算量,且输出特征图中一共有 N ∗ D F ∗ D F N * D_F * D_F N∗DF∗DF个点。
假设输入的特征图大小为 D F ∗ D F ∗ M D_F * D_F *M DF∗DF∗M,其中 D F D_F DF表示输入特征图的空间宽度和高度, M M M表示输入特征图的通道数(深度);
假设我们要分的组 g r o u p = g group=g group=g, 且我们仍然使输出特征图的通道数为 N N N。
那么我们就对输入特征图的通道分为 g g g组。对于每一组来说,
我们计算一下group convolution 的计算量。
首先我们先计算一个组的计算量,然后将得到的计算量乘以 g g g即得到总共的计算量。
那么一个组的计算量为 D K ∗ D K ∗ ( M / g ) ∗ ( N / g ) ∗ D F ∗ D F D_K * D_K * (M/g) * (N/g) * D_F * D_F DK∗DK∗(M/g)∗(N/g)∗DF∗DF;
那么group convolution的计算量为 D K ∗ D K ∗ ( M / g ) ∗ ( N / g ) ∗ D F ∗ D F ∗ g = D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F g D_K * D_K * (M/g) * (N/g) * D_F * D_F * g = \frac{D_K * D_K * M * N * D_F * D_F}{g} DK∗DK∗(M/g)∗(N/g)∗DF∗DF∗g=gDK∗DK∗M∗N∗DF∗DF
可见,group convolution 的计算量是普通的convolution的 1 g \frac{1}{g} g1倍。
在上一节中,我们已经知道:
当我们对输入特征图的通道分为 g g g组,对于每一组来说,
当分组个数 g = M g = M g=M,且 M = N M= N M=N时,对于每一组来说,
也即是说,一共有N=M个卷积核,每个卷积核只有一个通道,且与输入特征图的一个通道相对应。如下图所示。
可见,depthwise convolution 只是group convolution 的一种特殊形式。
那么我们可以套用group convolution的方式来计算depthwise convolution 的计算量。
可以算出depthwise convolution 的计算量是 D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F g = D K ∗ D K ∗ M ∗ D F ∗ D F \frac{D_K * D_K * M * N * D_F * D_F}{g} = D_K * D_K * M * D_F * D_F gDK∗DK∗M∗N∗DF∗DF=DK∗DK∗M∗DF∗DF
pointwise convolution 只是普通 convolution的一种特例。
它是一种卷积核大小是 1 ∗ 1 1*1 1∗1 convolution,其他和普通卷积没有区别。如图所示。
1 ∗ 1 1*1 1∗1 convolution是实现对输入特征图在通道方向上的加权组合,来生成新的特征图。并根据卷积核的个数的多少,决定输出特征图的通道数。
可见, 1 ∗ 1 1*1 1∗1 convolution的作用主要有两点:
1 ∗ 1 1*1 1∗1 convolution在很多经典网络中都有使用,比如GoogLeNet、ResNet、ResNext、MobileNet等等。它还有一个名称,叫bottleneck layer(瓶颈层)。
在第一节中我们介绍了普通 convolution的计算量是 D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F D_K * D_K * M * N * D_F * D_F DK∗DK∗M∗N∗DF∗DF。且在pointwide convolution 中的 D K = 1 D_K=1 DK=1,那么pointwide convolution的计算量是 M ∗ N ∗ D F ∗ D F M * N * D_F * D_F M∗N∗DF∗DF
pointwide group convolution 是group convolution的特殊形式。
它是一种卷积核大小是 1 ∗ 1 1*1 1∗1的group convolution,其他和group convolution没有区别。如图所示。
为什么要使用pointwide group convolution呢?我们可以在ShuffleNet 论文中找到答案。文中提到在ResNext论文中,一个residual unit 中 pointwide convolution所占的计算量是整个单元计算量的93.4%。 当我们密集使用 pointwide convolution时整个网络的计算量开销是不适合小型网络的,也就没办法在移动端以及嵌入式设备上使用。
在第二节中我们计算出了group convolution的计算量为 D K ∗ D K ∗ ( M / g ) ∗ ( N / g ) ∗ D F ∗ D F ∗ g = D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F g D_K * D_K * (M/g) * (N/g) * D_F * D_F * g = \frac{D_K * D_K * M * N * D_F * D_F}{g} DK∗DK∗(M/g)∗(N/g)∗DF∗DF∗g=gDK∗DK∗M∗N∗DF∗DF
那么pointwide group convolution的计算量为 M ∗ N ∗ D F ∗ D F g \frac{M * N * D_F * D_F}{g} gM∗N∗DF∗DF
本文介绍了移动端网络中常用的卷积操作。后续我们在阅读论文中会发现MobileNet 是使用了 depthwise convolution + pointwise convolution;ShuffleNet 是使用了pointwise group convolution + channel shuffle + depthwise convolution。
下篇文章再见。