一文看懂卷积操作


一、前言

由于个人兴趣和项目需要,最近一直在学习计算机视觉有关的知识,对于计算机视觉来说,最重要的自然是CNN卷积神经网络。而对于卷积神经网络来说,卷积操作是所有操作的核心,但是和很多同学一样,在最开始接触卷积神经网络的时候,我也被这个看起来有些迷幻的概念给弄糊涂了,简单查了一下,发现衍生的不同变体如2D卷积,3D卷积,1x1卷积,Transposed卷积有很多种,真是让人头大。不过有大佬总结了基本的卷积操作,发了一篇博客,由于原文是全英文,为了方便国内的同学学习,我将此文翻译过来,并加上一些自己的理解和大家分享交流。


二、卷积和互相关

卷积神经网络由卷积操作得名,卷积操作是信号处理,图像处理和其它领域最常用的一种操作。但是实际上,在深度学习领域,卷积操作使用互相关运算来代替。虽然在CNN中效果一样,但是卷积运算和互相关运算是有一些细微的差别的,有必要仔细了解。

首先看卷积运算的定义是:(fx)(t)=f(τ)g(tτ)dτ(f*x)(t)=\int_{-\infty}^{\infty}f(\tau)g(t-\tau)d\tau

定义表明,卷积操作是两个函数的积分,其中一个函数经过颠倒和位移操作,下图是卷积操作的可视化演示:

一文看懂卷积操作

左上角的两个图片是原始的f(t)f(t),g(t)g(t),gg是过滤器,首先将其颠倒如左下角二图所示,然后沿着水平坐标轴滑动过滤器如图右上角两图所示。在每一个位置,我们计算ff和颠倒后的gg交叉范围的面积,每一个具体点的交叉面积就是该点的卷积值,整个操作的卷积是所有卷积值的累加。

互相关运算的定义是两个函数的滑动点乘或者滑动内积,过滤器不需要经过颠倒操作。过滤器和函数的交叉区域的面积和就是互相关,下图展示了互相关运算和卷积运算的区别。

一文看懂卷积操作

在深度学习中,卷积运算中的过滤器并没有经过颠倒操作,因此实际上就是互相关运算。但是由于卷积神经网络中的卷积核(过滤器)的权重是随机初始化的,所以在此互相关运算和卷积运算没有本质的区别,可以把经过学习后得到的互相关过滤器看成是实际的卷积过滤器的颠倒。


三、深度学习中的卷积

深度学习使用卷积的目的是从输入中提取出有用的特征。在图像处理中,有很多可以使用的过滤器,不同的过滤器可以帮助提取不同方面的特征,同样在卷积神经网络中,不同的特征可以用不同的卷积核来提取,这些卷积核的权值是网络自动学习得到的。

使用卷积操作有很多优点,比如权值共享,平移不变性,更好的利用像素间的空间关系等。卷积神经网络的这些特征尤其在计算机视觉的任务中有用,因为在计算机视觉中,图像中的元素间具有空间中的联系。

3.1 单通道卷积

深度学习中的卷积操作是逐元素的乘法后求和,对于一个有一个通道的图像来说,卷积操作如下图所示:

一文看懂卷积操作

图中的卷积核(过滤器)是一个3x3的矩阵,卷积核按照从上到小,从左到右的顺序在输入空间中滑动,每滑动一个像素位置,卷积核和对应的位置的元素进行逐元素的相乘和求和,上图的输入经过卷积操作后得到的是一个3x3的输出。

3.2 多通道卷积

在大多数情况下,我们需要处理的都是多通道数据。例如对RGB图像来说,一张255x255的RGB图像的实际大小是255x255x3,第一个维度表示高度,第二个维度表示宽度,第三个维度表示通道数。下图是一个RGB图像的例子:

一文看懂卷积操作

另一个多通道数据的例子是在卷积神经网络中的不同层之间的输出,一个卷积神经网络的某一层通常包括很多不同的通道,每一个不同的通道从不同的角度描述了一部分的特征。卷积神经网络需要从原始输入开始不断增加通道数量从而提取到更多维度的特征,然后将这些特征进行综合考虑从而解决具体的问题,因此在卷积神经网络中涉及到通道数的增加和减少。

在进行接下来的学习之前,首先分辨几个术语的定义:层,通道,特征图,过滤器和卷积核。从层次化的视角来看,层和过滤器是同一个层面的术语,而通道和特征图可以认为是同样的概念。一个层可以有很多个通道(特征图):如果输入是RGB图像,那么输入层有三个通道。通道通常用来描述层的特征,类似的,卷积核通常用来描述过滤器的特征。

过滤器核卷积核的区别有时候让人模糊,有时候这两个术语被混用,但是实际上,这两个术语存在一定的区别。卷积核用来描述2维的权值数组,过滤器用来描述多个卷积核堆叠的3维结构。对于2维的过滤器来说,卷积核和过滤器是一个概念,但是对于3维过滤器和大部分深度学习中的卷积来说,过滤器是多个卷积核的集合。每一个卷积核都是独特的,用来提取输入通道的一部分特征。如下图所示:

一文看懂卷积操作

了解了这些概念,多通道卷积的操作按照如下顺序进行:每一个卷积核应用到对应的输入通道上,产生对应的输出结果,重复这个过程直到所有通道的输出产生完毕,将不同通道的输出按元素相加得到一个输出通道。下图展示了一个3x3x3的过滤器应用在5x5x3的输入上。首先每一个卷积核应用到对应的输入通道上,得到3x3x3的中间结果。

一文看懂卷积操作

然后将三个不同通道的结果按元素相加得到一个单一的通道,最终的结果是一个3x3x1的矩阵。

一文看懂卷积操作

同样的,我们可以想象在更多维度的输入中进行卷积操作,可以看成一个3维的过滤器矩阵在输入空间中进行滑动(输入矩阵和过滤器矩阵需要有相同的深度)。3维的过滤器在高度和宽度两个方向进行滑动(由于只有两个维度的滑动方向,所以被称为2维卷积操作)。在每一个滑动位置进行按元素相乘和求和,最终得到一个深度为1的输出。

一文看懂卷积操作

现在我们大致可以想象如何使输入矩阵和输出矩阵有不同的深度:对于一个有DinD_{in}深度的矩阵,如果我们想有DoutD_{out}深度的矩阵,那么我们即需要**DoutD_{out}个过滤器**,每一个过滤器有DinD_{in}深度,由于每一个过滤器会产生Hout×Wout×1H_{out}\times{W_{out}\times{1}}的输出,那么DoutD_{out}个过滤器可以产生Hout×Wout×DoutH_{out}\times{W_{out}\times{D_{out}}}的输出。


四、1×11\times1卷积

1×11\times1卷积是一种比较有用的卷积操作,在Network-in-Network中首先提出。可以理解为将输入层的每一个通道的每一个元素和一个数相乘,得到另一个数。对于多通道输入来说,这种操作可以用来改变输入输出的通道数量,如下图所示:

一文看懂卷积操作

上图的输入是一个H×W×DH\times{W\times{D}}的矩阵,经过和一个1×1×D1\times1\times D1×11\times1卷积进行运算之后,得到了H×W×1H\times{W\times{1}}的输出矩阵,如果有NN个这样的卷积,那么我们就可以得到输出层的形状是H×W×NH\times{W\times{N}}

使用1×11\times 1卷积有以下几个优点:

  1. 维度降低减少计算量
  2. 低维度嵌入(特征池化)
  3. 增加卷积的非线性表达

从某种意义来说,1×11\times1卷积相当于全连接层。


五、卷积算法

阅读到现在,我们应该了解了卷积如何处理深度,接下来讨论卷积如何处理另外两个维度:高度和宽度。

在涉及高度和宽度中有几个重要的术语:

  1. 卷积核大小:卷积核大小既是卷积核的高度和宽度,度量了一个卷积核的感受野的范围。
  2. 步长:步长用来描述当卷积核在输入空间滑动时,每一次滑动需要跳过的距离。
  3. 填充:填充用来描述如何处理输入的边界,如果不添加填充,那么输出的高度和宽度会小于输入的高度和宽度。

下面动图描述了在2维卷积中使用大小为3的卷积核,步长为1,填充为1:

一文看懂卷积操作

对于一个输入大小为i的图像,卷积核大小为k,步长为s,填充的p,输出的图像的形状为:

o=lowerbound(i+2pks)+1o=lowerbound(\frac{i+2p-k}{s})+1


六、参考资料

  1. A Comprehensive Introduction to Different Types of Convolutions in Deep Learning
  2. Convolution arithmetic animation
  3. A guide to convolution arithmetic for deep learning