在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

CNN 的近邻图像块计算中一般都存在冗余问题,当存在池化层或步幅为 1 时,减少冗余的方法将变得更加复杂。本文中,来自德国 AI 研究中心等机构的研究者提出了一种在有池化层和步幅为 1 时也能有效减少冗余的方法。他们的方法普遍性很强,可应用于几乎全部现有的 CNN 架构上,来实现快速的特征提取。

虽然绝大多数的 CNN 都直接运行在整张图像上,但还有很多重要任务需要使用基于图像块(patch based)的 CNN 来处理:在一个邻近、重叠的图像块上多次运行同一个 CNN。这类问题大多可以归为基于 CNN 的特征提取的范畴 [8, 10],其中包括如摄影机校准、图像块匹配 [2]、光流估计 [1, 5],以及立体匹配 [13]。另一方面,也有一些重要的基于图像块的应用场景,如滑动窗口的物体识别与检测 [7],通常并不会被归为特征提取任务。

所有基于图像块的任务,在近邻的 CNN 计算之间都存在大量冗余,如图 1 所示。如果没有池化层(pooling layer)或步幅等于 1(striding layer),则可以通过在整张图像上运行某个通过有限图像块训练的 CNN 来避免这些计算冗余。但如果存在池化层,情况就会变得很复杂。目前,人们的做法一般是:彻底避免池化层或步幅为 1 [13]、直接使用冗余计算 [5] 或设计出一个也能得到更稀疏结果的方法 [6, 7]。研究者意识到,仅有他们之前的研究 [1] 来尝试避免这一冗余,但也没有详细介绍用于避免冗余的方法。

图 1:左:一个简单的 1 维 CNN。右:如果将此 CNN 运行在图像的每个像素位上,来为每个像素位创造特征,许多中间层结果会在网络之间实现共享。节点上的数字为该节点被共享的次数。红色连接展示了红色节点是如何共享的。步长为 2 的池化减半了输出分辨率。因此,我们需要两个池化层:一个原始的(蓝色)和一个平移了一个像素的(绿色),来避免输出分辨率被减半。

在本文中,研究者展示了一个优美的、可推广的避免冗余计算的方法,存在池化层或步幅为 1 时本方法依然有效。此方法只需要在原始 CNN 层的基础上添加实现转置和重塑(reshape)运算的神经层。这两种运算基本在所有的机器学习框架中都适用。另外,此方法几乎可以在目前所有的 CNN 架构中使用。

论文结构如下:第 2 部分展示相关研究;第 3 部分展示本文的方法;第 4 部分展示该方法的一个基准测试。最后在附录部分,为深度学习框架 Torch 的示例源代码,使本研究的贡献更加清楚易懂。

方法

本文中我们希望将一个 CNN CP(利用图像块 P T 训练得到)迅速高效的运行于输入图像 I 的所有图像块 P(x, y) 上。输出向量 O(x, y) = CP(P(x, y)) 为一个 k 通道向量,属于 (I_h,I_w, k) 维的输出矩阵 O,其中 O 包含了 CP 在所有图像块 P(x, y) 上运行的结果。

图 2:通过本文的方法,从网络 CP 中生成网络 CI。CI 结果和在图像 I 的每个图像块上独立运行 CP 得到的结果相同。但 CI 运行速度更快,因为其避免了重叠图像块上的冗余计算。

图 3 展示了池化的主要问题:不同的图像块 P(x, y) :即使它们本身是直接相邻的,如 P(x, y) 和 P(x+1, y),也需要不同的池化,因此无法共享池化输出。

图 3:图像不同位置的图像块 P(红线表示)。第一个图像块 P(x, y) 需要的图像块 2x2 池化(蓝色)和第二个图像块 P(x + 1, y) 所需的(绿色)不同。但图像块 P(x + 2, y) 则可以再使用第一个池化(蓝色)。P(x, y) 和 P(x + 2, y) 的重叠部分结果相同,因此可以共享(黄色部分)。蓝色图像块和绿色图像块之间无法共享池化

图 4 展示了 2×2 池化的展开。当存在多个池化层是,直接展开相当复杂。这也许是之前研究避免池化层的一个原因。

图 4:左:来自 2×2 多池化(Multi-pooling)得到的 2×2 = 4 输出图。右:输出 O 的最终展开。

如图 5 所示,需要将将内部的 x 和 y 维传递给右边,并将外部维度传递给左边。

图 5:问题 (x2, x1 +1) = (x2, x1) + 2 和 (x2, x1) = (x2, x1) + 1:内部维度 x1 的步长更大。可以通过转置(交换)两个维度来修复此问题。然后,记忆(memory)的重新解释(重塑)可以将其降低为一个 x 维度。

实验

表 1:CP 和 CI 的速度基准测试。后者的速度明显更快,在更大图像上尤为如此。研究者提供了基准测试的源代码作为补充材料,以满足复现性要求。对于 CP 而言记忆并不是一个大问题(见正文)。

论文:Fast Dense Feature Extraction with CNNs that have Pooling or Striding Layers

论文地址:https://arxiv.org/pdf/1805.03096.pdf

近年,许多研究表明,基于卷积神经网络提取的特征比工程化特征表现更好。但目前还缺少在完整图像上高效提取局部特征的研究。本文展示了一种当存在池化层和步幅为 1 时,对完整图像计算基于图像块的局部特征解释器的高效算法。这是一种通用方法,可以应用于几乎所有的现有神经网络架构。这包含了所有的用于局部特征提取的神经网络,如摄影机校准、图像块匹配、光流估计,以及立体匹配。另外,此方法也可以应用于其他基于图像块的方法,如滑动窗口的物体检测与识别。我们将一个基于 CNN 的特征提取方法运用于整张图像,并给出使用/未使用我们的加速方法下的速度基准测试,以及对应的(Torch)示例代码:这表明任意 CNN 架构都可以轻松地用我们的方法转换。

理论论文卷积神经网络池化层可视化
相关数据
神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

卷积神经网络技术
Convolutional neural network

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

基准技术
baseline

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

池化技术
Pooling

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

物体识别技术
object recognition

计算机视觉领域的一个分支,研究物体的识别任务

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

卷积技术
Convolution

推荐文章