卷积神经网络

什么是卷积

在数学上,卷积(又名褶积),是通过两个函数\(f\)\(g\)生成第三个函数的一种数学运算,其本质是一种特殊的积分变换:

\(f(x),g(x)\)\(R\)上的两个可积函数,则卷积为: \[ h(x) = \int_{-\infty}^{+\infty}f(\tau)g(x-\tau)d\tau \] 由上式可知,卷积是两个变量在某范围内相乘后求和的结果。如果卷积变量的序列是\(x(n)\)\(h(n)\),则卷积的结果为:

\[ y(n) = \displaystyle\sum_{i=-\infty}^{+\infty}{x(i)h(n-i)} = x(n)*h(n) \]

其中,星号\(*\)表示卷积。

对于两个数列\(\{x_n\},\{h_n\}\),卷积:\(y_t = \displaystyle\sum_{i=1}^{t}{x_{i}h_{t-i}}\)

即: \[ y_t = x_1h_{t-1} + x_2h_{t-2} + \cdots + x_{t-2}h_2 + x_{t-1}h_1 \] 我们可以发现,卷积是两个序列反向乘积求和,也就是\(\{x_n\}\)正向,\(\{h_n\}\)反向,各元素相乘求和,就是卷积的结果

对于连续函数也是如此,比如在区域\([0,t]\)的卷积: \[ h(x) = \int_{0}^{t}{f(x)g(t-x)dx} \] 其相当于\(f(x)\)与在\([0,t]\)内反过来的\(g(x)\)在对应位置相乘后相加的结果。

这也可以看成是称为“卷积”的原因。

在统计学上,加权移动平均可以看成是一种卷积:\(g(t)\)可以看成为权重衰减的函数,其与距离当前时刻的时间间隔有关;\(f(t)\)可以看成为每个时刻新增/投入的元素数量,其与对应时刻有关;那么对于时刻\(T\),考虑从0时刻到\(T\)时刻,平均后的结果为: \[ \int_{0}^{T}{f(t)g(T-t)dt} \] 因此,卷积可以看为一种加权移动平均,越接近当前时刻的结果对当前预估影响越大。

从全连接到卷积

对于一张\(255\times255\)大小的图像,如果使用全连接层,将图像展开成一维向量,一共有\(255\times255 = 65025\)个元素,如果通过一个1000个神经元的隐藏层,那么这个隐藏层就有\(255\times255\times1000 = 65,025,000\)个权重,权重数量太大,如果神经网络再深一点,模型占用的内存会很大,计算量也会很大。

使用全连接层,就意味着每一个像素点都是一个特征,那么神经网络就要学习一张图像上的每一个绝对位置,但是我们要识别的物体每次很可能都不在同一个地方出现,这是用全连接神经网络识别图像的另一个弊端。

图像上的物体在不同的图像上出现的位置不一定相同,因此我们希望神经网络具有“平移不变性”,也就是不管检测对象出现在图像的哪个位置,神经网络的前面几层应该对相同图像区域具有相似的反应。

同时,检测的物体不一定会占据整个图像,往往只占据图像的一部分,因此我们希望神经网络具有“局部性”,也就是神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

对于全连接层,我们先将图像从矩阵平铺成一个向量,然后再输入给全连接层,全连接层一个神经元的输出,我们也可以看成是输出图像平铺成向量中的一个像素。

我们可以将输入向量和输出向量还原成图像,其中一个神经元我们用\((i, j)\)表示其位置,代表其输出的值在输出图像矩阵的\((i, j)\)处,输入向量的每个元素我们也用\((k, l)\)来表示其位置(在输入图像矩阵的\((k, l)\)处),那么对于\((i, j)\)的神经元,其应该有\(k\times l\)个权重,与输入\((k, l)\)处相乘的权重设为\(W_{k, l, i, j}\),该神经元的偏置为\(U_{i,j}\),该神经元线性输出的部分为\(H_{i, j}\),输入图像位于\((k, l)\)处的元素为\(X_{k,l}\),则 \[ H_{i,j} = U_{i,j} + \sum_{k}\sum_{l}W_{i,j,k,l}X_{k,l} \]\(k=i+a\)\(l=j+b\),则 \[ H_{i,j} = U_{i,j} + \sum_{a}\sum_{b}W_{i,j,i+a,j+b}X_{i+a,j+b} \] 其中\(a\)\(b\)可以是负的整数也可以是正的整数,表示的意思是输入图像\((k,w)\)处与当前输出图像\((i, j)\)处的相对位置,

\(V_{i,j,a,b} = W_{i,j,i+a,b+j}\),则 \[ H_{i,j} = U_{i,j} + \sum_{a}\sum_{b}V_{i,j,a,b}X_{i+a,j+b} \] 其中\(W\)\(V\)只是换了一种表达方式

考虑平移不变性,权重和偏置不因像素点位置的变化而变化,那么\(V\)\(U\)不应该依赖绝对的像素点的位置\((i,j)\),则 \[ \begin{aligned} &V_{i,j,a,b} = V_{a,b}\\ &U_{i,j} = u \end{aligned} \] 那么 \[ H_{i,j} = u +\sum_{a}\sum_{b}V_{a,b}X_{i+a,j+b} \] 这就是二维交叉相关(并不是卷积,卷积需要将\(V_{a,b}\)倒置),我们是使用系数\(V_{a,b}\)对位置\((i,j)\)附近的像素\((i+a,j+b)\)进行加权得到\(H_{i,j}\)\(H_{a,b}\)会比\(V_{i,j,a,b}\)小很多

考虑局部性,为了收集训练参数\(H_{i,j}\)的相关信息,我们不应偏离到距离\((i,j)\)很远的地方。这意味着在\(|a|>\Delta\)\(|b|>\Delta\)的范围之外,我们可以设置\(V_{a,b}=0\),因此,我们可以将\(H_{i,j}\)重写为 \[ H_{i,j} = u + \sum_{a=-\Delta}^{\Delta}\sum_{b=-\Delta}^{\Delta}V_{a,b}X_{i+a,j+b} \] \(V\)被称为卷积核(convolution kernel)或者滤波器(filter)

卷积神经网络

卷积神经网络(Convolutional Neural Networks, CNN),是一类包含卷积计算且具有深度结构的前馈神经网络,常用于计算机视觉领域,用于图像识别和处理。

卷积神经网络的灵感来自于动物视觉皮层组织的神经连接方式。单个神经元只对有限区域内的刺激做出反应,不同神经元的感知区域相互重叠从而覆盖整个视野。

——维基百科

卷积神经网络的应用

  • 影像识别
  • 视频分析
  • 自然语言处理(CNN模型被证明可以有效的处理各种自然语言的问题,如语义分析、搜索结果提取、句子建模、分类、预测、和其他传统的NLP任务等——维基百科)
  • 药物发现
  • 图片识别
  • 物体识别
  • 行为认知
  • 姿态估计
  • 神经风格迁移(神经风格迁移是卷积神经网络的一项特殊应用,其功能是在给定的两份图像的基础上创作第三份图像,并使其内容和风格与给定的图像尽可能接近——百度百科)

卷积神经网络的结构

graph LR
id1(["输入层"]) --> id2(["卷积层"]) --> id3(["池化层"]) --> id4(["全连接层"]) --> id5(["输出层"])

其中,卷积层和池化层可能不止一个:Inception模块:是对多个卷积层和池化层进行堆叠所得的隐含层构筑。具体而言,一个Inception模块会同时包含多个不同类型的卷积和池化操作,并使用相同填充使得上述操作得到相同尺寸的特征图,随后在数组中将这些特征图的通道进行叠加并通过激活函数。

卷积层

对于一个灰度图像,我们可以将其视为一个二维矩阵,矩阵上的每一个元素就代表着这个图像的像素,如果矩阵上一个元素的值越大,代表着其对应的像素点越亮,越接近白色;如果矩阵上一个元素的值越小,代表着其对应的像素点越暗,越接近黑色。

对一个灰度图像进行卷积操作,意味着这个灰度图像构成的矩阵为\(f\)函数,现在,我们需要一个\(g\)函数,并将\(f\)函数内的各个值与\(g\)函数内的各个值相乘后相加。

既然\(f\)函数对应的是一个矩阵,那么\(g\)函数对应的也应该是一个矩阵。不过\(g\)函数对应的矩阵一般远远小于\(f\)函数对应的矩阵,具体的原因我们之后会提到。

\(g\)函数对应的矩阵我们称之为卷积核

卷积核与卷积操作

一种常见的卷积核是\(3\times3\)大小的矩阵,而原本的灰度图像是一个非常大的矩阵,我们应该如何进行卷积运算呢?

首先,我们将卷积核放到图像矩阵的左上角,然后将图像左上角\(3\times3\)部分各个元素分别与卷积核矩阵内对应的各个元素相乘,再将这些值相加,得到一个新的值。我们将这个新的值放到新生成矩阵的左上角第一个元素的位置。

1

然后我们将卷积核向右平移一个单位,将图像对应位置的矩阵内各个元素与卷积核内对应的各个元素相乘后相加,得到一个新的值,将这个值放到新生成矩阵第一行第二列的位置。依此类推。

2

第一行操作完后,将卷积核左上角第一个元素与图像第二行第一个元素对其,继续如上操作,依此类推,我们可以得到一个新的矩阵。

3
卷积操作的动态图

这就是深度学习中对一个灰度图像进行的一次卷积操作。

但我们会发现,深度学习中的卷积操作其实是将\(f\)\(g\)对应位置进行相乘,数学上的卷积则不同,严格来讲,真正的卷积操作我们需要将卷积核进行倒转,我们原先将对应位置相乘后相加的操作其实叫做相互关。但倒转这个操作在图像的卷积中并没有什么意义,因此,在深度学习中便省略了这个步骤,而是直接将相互关称为卷积

过滤器与卷积操作

像灰度图像的卷积核,我们也可以称为过滤器。那么,过滤器与卷积核有什么联系和区别呢?

除了灰度图像,日常生活中我们更常见的是彩色图像,在计算机中,彩色图像对应了红、绿、蓝三种颜色的组合搭配,我们可以认为彩色图像是由红、绿、蓝三种颜色的图像共同形成的。因此,在计算机中,彩色图像对应了3个矩阵,分别代表着红色、绿色、蓝色图像的三个矩阵,也就是RGB三个通道(R为红色通道,G为绿色通道,B为蓝色通道)。

因此,对于一个彩色图像的输入,我们需要有三个卷积核,分别处理三个通道上的矩阵。

如果每一个卷积核都是\(3\times3\)大小的矩阵,那么这三个卷积核所构成的就是一个\(3\times3\times3\)大小的立方体。其中\(3\times3\times3\)三个3分别代表着:高度、宽度和通道数。高度也就是原先一个矩阵的行数,宽度也就是原先一个矩阵的列数,通道数也就是卷积核的个数。

那么,3个卷积核构成的\(3\times3\times3\)的立方体,我们也称之为过滤器。

过滤器与卷积核

因此,我们可以这样认为:卷积核是对应一个矩阵的\(g\)函数,而过滤器则是对应一个图像(含有多个通道)的\(g\)函数。

那么,我们应该如何进行三维上的卷积操作呢?

彩色图像有三个通道,过滤器也有三个通道,与二维上的卷积操作一样,三维上的卷积首先会将过滤器放到原本图像的左上角,将原图像对应位置的立方体内各个元素和过滤器立方体内各个元素相乘后相加,得到新矩阵的第一个元素,往后依此类推。

三维卷积
三维卷积

卷积操作的padding与步长

之前我们使用的都是最基本的卷积操作,卷积操作除了过滤器的大小外,还涉及到了padding与步长。

Padding

我们进行基本的卷积操作后,会发现新得到的图像(新得到的矩阵或多通道矩阵(立方体))的大小会缩小,假设原本图像的大小为\(n\times n\times n_c\),过滤器的大小为\(f\times f\times n_c\)\(n_c\)代表通道数,\(n\times n\)代表原图的高与宽,\(f\times f\)代表过滤器的高与宽),那么新得到的图像的大小就为:\((n - f + 1)\times(n-f+1)\)

这样做会有两个缺点:

  • 进行多次卷积操作后,图像的尺寸会越来越小,这也许并不是我们所期望看到的
  • 进行基本的卷积操作,我们会发现,图像上的一个像素在新生成的矩阵中,影响了多个元素(因为过滤器移动中,原图像一个元素分别会与过滤器的各个元素相对应,对新图像上与之相关的位置的元素的值占有一定的比例)。但在原本图像的边角上,像素会影响更少的新图像上的元素,因为过滤器不能超出原图像的范围,原图像边角上的元素不能与过滤器上各个位置都对应一遍,那么边角对于新图像的影响就更小。因此,最基本的卷积操作可能让我们丢失原图像边角位置的部分信息。

为了解决这个问题,我们可以在原本图像的最外面包裹/填充一层的0(用0包裹意味着用黑边包裹)

包裹一层的0

这样相当于我们将原图像扩大了,那么新生成的图像与原图像的大小会相同。

我们把这种操作叫做padding,当然,除了让新生成图像与原图像大小相同,我们还可以使用padding使得新图像更大。

新图像更大

在圆图像外面加几层,我们可以用\(p\)来表示,那么,新图像的大小可以表示为: \[ (n + 2p - f + 1)\times(n + 2p - f + 1) \]\(p = 1,f=3\)时,新图像与原图像大小相同,原图像上的边角也发挥了更大的作用。

常见的padding选择方式有两种:valid卷积same卷积

  • valid卷积意味着不填充
  • same卷积意味着输出图像与输入图像大小相同,这意味着\(2p - f + 1 = 0\),即\(2p + 1 = f\)\(2p+1\)很明显是奇数,因此,如果使用same卷积,过滤器的高宽通常都是奇数,以避免填充时左右上下不对称的情况(比如\(p=1.5\),意味着一边填充一层,另一边填充两层)。因此,我们使用的过滤器的高度和宽度通常都是奇数。

过滤器高度与宽度均为奇数的原因除了为了方便same卷积之外,还有一点,就是奇数的个数能够使得过滤器具有中心位置。

卷积步长

在最基本的卷积操作中,一步操作完后,我们每次都只是将过滤器向右平移一个单位,但如果我们愿意,也可以选择平移多个单位,一次平移多少个单位,我们称之为步长,通常用\(s\)表示,最基本的卷积操作中,\(s = 1\)

\(s = 2\)时,我们每次向右平移两个单位,当无法再向右平移时,我们将过滤器向下平移两个单位,继续从最左边开始。

加入了padding和卷积步长后,输出图像大小可以表示为: \[ \lfloor \frac{n + 2p - f}{s} + 1 \rfloor \times \lfloor \frac{n + 2p - f}{s} + 1 \rfloor \] 因为卷积操作不能超出设定的高与宽(\(n + 2p\)),加入步长后,有时候每一行最后面的几个元素无法被进行卷积操作,因此我们这里选择向下取整操作。

padding+卷积步长

卷积核、过滤器的作用

加权平均从而突出特征

根据前面卷积的定义,我们可以知道,卷积拥有加权平均的作用,因此,我们可以认为新图像是这么生成的:

过滤器上各个元素对应的就是权重,代表着原图像上各个像素点的“重要程度”。而过滤器与输入图像卷积的操作,就是对输入图像进行加工,使得突出更重要的信息,减小不重要信息的影响程度,从而突出输入图像的“特征”。

如过滤器上所有的元素的值均相同,那么其起到的作用就是将输入图像变得更加平滑。

边缘提取从而突出特征

一个图像,最重要的很可能就是一个个物体的“边缘”,而特定的过滤器则有边缘提取的作用。

比如:

1 0 -1
1 0 -1
1 0 -1

对于如上卷积核,我们可以认为其作用为垂直边缘提取,因为,如果原图像与之对应的像素点亮度全部相同,那么相乘再相加的结果为0,而如果原图像与之对应的像素点亮度相差很大,比如左边很亮而右边很暗(左边元素值大而右边元素值小),那么计算出的结果就是一个很大的值,代表着原图在对应位置是由亮变暗的过程,而且变化比较剧烈;如果左边很暗而右边很亮,那么计算出的结果就是一个负值,并且绝对值比较大,代表着原图在对应位置是由暗变亮的过程,而且变化比较剧烈。

再比如:

1 1 1
0 0 0
-1 -1 -1

对于如上卷积核,我们可以认为其作用为水平边缘提取,原理与上面垂直边缘提取相同。

我们发现,无论是垂直边缘提取还是水平边缘提取,都是凸显出输入图像中亮度变化幅度大的地方,隐藏输入图像中亮度变化幅度小的地方。这是因为,我们通常认为物体与背景的区别会比较明显,对应着灰度图像中亮度区别会比较明显。这样我们就能够将物体的边缘与背景或者物体内部区分开来,从而提取出物体的边缘。

当然,除了水平边缘提取和垂直边缘提取,我们还能够提取斜向的边缘,比如:

-1 0
0 1
0 -1
1 0

或者是更加强调中间部分的作用,边缘提取以中间权重最大:

-1 0 1
-2 0 2
-1 0 1
-1 -2 -1
0 0 0
1 2 1

常见的边缘提取算子有:

常见的边缘提取算子

边缘提取的效果:

边缘提取的效果

需要注意的是,在深度学习中,过滤器中各个元素的值并不是我们来决定的,而是通过学习得来的,因此,在深度学习中,我们无需使用特定的边缘检测算子。也就是说,过滤器中各个元素都可以视为一个权重\(w\),而在深度学习中,会通过反向传播不断更新过滤器中元素的值。

综上,我们可以得出结论,无论是加权平均还是边缘提取,过滤器的作用都是突出特征,进行特征提取操作。

比如,我们要识别一张老鼠的图片:

老鼠图片
特征识别
特征识别

我们会发现,与过滤器特征越接近,得到的结果就越大,否则结果就越小,因此,我们可以通过得到新图片元素的大小来判断是否存在对应的特征。

使用多个过滤器

一个过滤器只能够学习出一个特征,如果我们想要识别出多个特征,那么就需要多个过滤器。

假设输入的图像是\(n_H\times n_W\times n_c\)维度的,其中\(n_H\)表示图像的高,\(n_W\)表示图像的宽,\(n_c\)表示图像的通道数

注意,在pytorch中,输入的图像维度应该是\((\mathrm{N}, \mathrm{n_c}, \mathrm{n_H}, \mathrm{n_W})\),其中\(N\)表示样本数

现在我们使用的过滤器为\(f\times f\times n_c\)维度(过滤器维度应该与输入图像维度相同),总共使用了\(k\)个过滤器,那么,输出图像的维度为: \[ \lfloor \frac{n_H+2p-f}{s}+1 \rfloor\times\lfloor \frac{n_W+2p-f}{s}+1 \rfloor\times k \] 将卷积层放于神经网络中,\(n_H^{[l]}\)代表第\(l\)层神经网络输出图像的高度,\(n_W^{[l]}\)代表第\(l\)层神经网络输出图像的宽度,\(n_c^{[l]}\)代表第\(l\)层神经网络输出图像的深度(通道数),\(k^{[l]}\)代表第\(l\)层使用的过滤器个数,则: \[ \left\{ \begin{aligned} &n_H^{[l]} = \lfloor \frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s}+1 \rfloor\\\ &n_W^{[l]} = \lfloor \frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s}+1 \rfloor\\\ &n_c^{[l]} = k^{[l]} \end{aligned} \right. \]\(l\)层过滤器的维度为: \[ f^{[l]}\times f^{[l]}\times n_c^{[l-1]} \]

两个过滤器

完整的一个卷积层

对输入图像进行卷积操作过后,我们可以理解为对数据进行了加权求和,如果想要得到真正的线性函数结果,我们还需要对输出的图像加上偏置\(b^{[l]}\),对于一个过滤器求得的一个通道矩阵,只需要使用一个偏置即可,不同的过滤器使用不同的偏置。加上了偏置后,我们就得到了线性结果对应的立方体\(Z^{[l]}\)

接下来,我们应该使用激活函数,比如ReLU函数,可以得到输出的特征图像(多通道的特征图像)\(A^{[l]} = g(Z^{[l]})\)

因此,一个完整的卷积层我们可以认为是:

  1. 卷积操作
  2. 加上偏置
  3. 通过激活函数

卷积层的优点

相比于全连接层,卷积层有如下优点:

  • 参数共享:对于一个过滤器而言,其含有的参数量是很少的,而这个过滤器通过了图像上所有的部分,因此,我们可以认为这个过滤器上的参数是图像上所有部分所共享的。而参数共享之所以有效,是因为学习出的特征如果适用于图片的某个区域,那么它也可能适用于图片的其他区域,即一个图片上很可能具有多个相同的特征,而我们仅仅使用一个特征检测器(过滤器)就能够将这些特征都提取出来
  • 稀疏连接:输出图像中的一个像素点并不依赖于输入图像的所有像素点,其只依赖于原图上通过卷积运算与之相关的一些像素点,也就是说,输出的像素点不依赖于所有输入的特征,只依赖部分特征。
  • 学习图像的相对关系:过滤器往往远远小于输入图像,而我们知道过滤器起到一个加权平均从而提取图像特征的作用,对于一个输出图像,其起到影响的只有输入图像对应位置附近的一些像素点,因此,卷积层学习的是图像的相对关系。而对于全连接层,每一个像素点都是一个特征,我们要识别的物体的位置其实不是很重要,也就是说,某一个特定像素点到底在物体内部还是物体外部并不重要,但对于全连接神经网络而言,因为其学习的是图像绝对位置,那么这个像素点到底在物体内还是物体外就显得很重要了,但在实际中,物体到底在左边还是在右边,对我们的识别应该不会产生影响才行,因此,全连接神经网络起不到一个比较有效的作用。

卷积层与全连接层的联系与区别

在卷积神经网络中,一个卷积层(第\(l\)层神经网络)的输入图像的维度为\(n_W^{[l-1]}\times n_H^{[l-1]}\times n_c^{[l-1]}\),输出图像的维度为\(n_W^{[l]}\times n_H^{[l]}\times n_c^{[l]}\),其中\(n_c^{[l]}\)表示该卷积层过滤器的个数。

那么,我们可以将输入图像的每一个像素点视为上一层一个神经元的输出,输出图像的每一个像素点视为该层神经元的输出。

只考虑一个通道时(仅考虑二维情况),输出图像的一个像素点只和输入图像的\(f_W\times f_H\)个像素点有关(\(f_W \times f_H\)为本层过滤器的维度),也就是说,该层神经网络中的一个神经元,仅和上一层神经网络中\(f_W\times f_H\)个神经元相连接,在不使用same卷积的情况下,该层神经网络中表示边角的部分可能会与上一层更少的神经元相连接。

比如,对于一个\(3\times3\)的过滤器,在使用same卷积时,卷积层一个神经元只会与上一层\(9\)个神经元相连。

卷积层神经元

除了神经元的连接个数,与全连接神经网络不同的是,卷积层的所有神经元都共享参数。比如对于\(3\times3\)过滤器的same卷积,该层每个神经元都与上一层的9个神经元相连接,那么,该层的每个神经元都有9个权重和1个偏置,而每个神经元的权重和偏置都相同,因为\(3\times3\)的过滤器只有9个权重,之后仅加上一个偏置,而该层所有神经元的计算结果都是靠这个过滤器与输入图像卷积得来的,并且一个过滤器仅一个偏置。

如果是多通道,那么本层的一个神经元最多与上一层\(f_W\times f_H\times n_c^{[l-1]}\)个神经元相连(\(f_W\times f_H\times n_c^{[l-1]}\)是本层一个过滤器的维度)

反过来看,全连接层也就是和上层所有的神经元相连,那么就相当于过滤器的维度与输入图像的维度完全相同。而本层神经元的个数就是过滤器的个数。

\(1\times1\)卷积

\(1\times1\)卷积又被称为网络中的网络(Network in Network, 简称NIN)

\(1\times1\)卷积并没有起到加权平均的作用,因此很难代表输入图像中的一个特征,那么,\(1\times1\)卷积到底有什么作用呢?

对于一个过滤器,其输出的图像是一个二维的矩阵,而多个过滤器会形成多个通道的图像,因此,我们可以通过控制一个卷积层中过滤器的个数从而实现控制输出图像通道的数量。

因此,\(1\times1\)的过滤器能够实现降维或者升维的作用。

对于一个\(1\times1\)过滤器,其起到的作用是融合不同通道的信息,对不同输入通道同一个位置加权求和。

通道数量的减少则会明显减少卷积操作的计算次数,因此,使用\(1\times1\)卷积操作降维后附带有减少计算次数的作用。

对于一个卷积层,其进行卷积操作并加上偏置后需要使用非线性的激活函数,因此,使用\(1\times1\)的卷积能够加大网络的非线性特性,增加神经网络的表达能力(利用非线性的激活函数)。

对于一个过滤器,其会将不同通道上同一个位置的各个元素进行相加,因此,我们可以认为\(1\times1\)的过滤器起到了整合多个通道信息的作用,实现了跨通道的信息交互,能够使网络提取的特征更加丰富。

如果将输入图像特定高度与宽度的所有通道的像素点视为一个样本,每个通道对应的值视为一个特征,那么这个图像就有\(n_W^{[l-1]}\times n_H^{[l-1]}\)个样本,每个样本有\(n_c\)个特征。此时,\(1\times1\)卷积可以看为全连接(过滤器的维度为\(1\times1\times n_c^{[l-1]}\)),其起到了综合所有通道的作用。

综上,\(1\times1\)卷积有如下作用:

  • 降维/升维
  • 减少卷积操作的计算次数
  • 加大网络的非线性特征,增加神经网络的表达能力,使网络更“深”
  • 整合多个通道信息的作用,实现跨通道信息交互
  • 特殊视角下可以视为全连接

二维卷积层的计算复杂度

假定一个样本的输入图像维度为\(c_i\times n_h\times n_w\),其中\(c_i\)表示输入图像的通道数,\(n_h\)表示输入图像一个通道上二维矩阵的高度,\(n_w\)表示输入图像一个通道上二维矩阵的宽度。

假定卷积层的核\(W\)维度为\(c_o\times c_i\times k_h\times k_w\),其中\(c_o\)表示一个样本输出图像的通道数(也就是过滤器的个数),\(k_h\)表示一个过滤器上一个卷积核的高度,\(k_w\)则为宽度。那么偏差的维度为\(c_o\times c_i\)(一个卷积核只有一个偏差)

假定一个样本输出图像的维度为\(c_o\times m_h\times m_w\),其中\(m_h\)表示图像一个通道上的高度,\(m_w\)则表示宽度

计算复杂度: \[ O(c_{i}\times c_{o}\times k_w\times k_h\times m_h\times m_w) \] 也就是说,输出图像一共有\(c_o\times m_h\times m_w\)个像素,每个像素都经过了一个过滤器的运算,过滤器每计算一个输出像素需要进行\(c_i\times k_h\times k_w\)的运算,因此一个卷积层对一个样本一共计算了\(c_{i}\times c_{o}\times k_w\times k_h\times m_h\times m_w\)

GFLOPS(Giga FLoating-point Operations Per second)是衡量计算机性能的一个指标,表示每秒能执行的十亿次浮点运算。

比如, \[ \begin{aligned} &c_i=c_o=100\\ &k_h=k_w=5\\ &m_h=m_w=64 \end{aligned} \] 那么一个样本通过这个卷积层的运算次数为 \[ c_{i}\times c_{o}\times k_w\times k_h\times m_h\times m_w = 1,024,000,000 \] 差不多是10亿次浮点运算,也就是1GFLOPS

如果有10层,1M个样本,那就是10PFLOPS(PFLOPS是Peta FLoating-point Operations Per second的缩写,表示每秒能执行千万亿次浮点运算,具体来说,1PFLOP等于\(10^{15}\)次浮点运算)

如果一个CPU的计算能力是0.15TF(Tera FLOPS,每秒能执行万亿次浮点运算,也就是\(10^{12}\)次浮点运算),那么就需要18个多小时才能完成一次前向传播;如果一个GPU的计算能力是12TF,那么就需要14分钟完成一次前向传播

池化层

基本概念

与卷积层相同的是,池化层也有过滤器,过滤器也有高、宽、通道数三个维度,也有padding和步长。

与卷积层不同的是,池化没有权重,也不需要进行梯度下降,池化结束后也不需要加上偏置,也不需要通过激活函数。

池化的过滤器其实执行的是固定的计算:求最大值或者求平均值。

求最大值的称为最大池化,求平均值的称为平均池化。

当然,我们还可以求基于距中心像素距离的加权平均、求\(L_2\)范数、按照概率随机取元素值等等,但不论是求最大值、求平均值、求加权平均还是求\(L_2\)范数,其函数都是固定的,池化层并没有参数需要进行学习、梯度下降。

​ 不管选用什么样的池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变。平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。

局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。例如,当判定一张图像中是否包含人脸时,我们并不需要知道眼睛的精确像素位置,我们只需要知道有一只眼睛在脸的左边,有一只在右边就行了。但在一些其他的领域,保存特征的具体位置却很重要。例如当我们想要寻找一个由两条边相交而成的拐角时,就需要很好地保存边的位置来判定它们是否相交。

使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。

——《深度学习》

池化

上面的图片展示的是padding为0,步幅为2,大小为\(2\times2\)的过滤器分别进行最大池化和平均池化。

最大池化
最大池化
最大池化

在过滤器与输入图像对应的位置,选取输入图像对应位置内的所有元素值的最大值,映射到输出图像上的一个元素中,映射方式与卷积层一样。

反向传播

最大池化可以视为提取输入图像的主要特征(假定值越大特征越明显,与之前卷积核提取特征的假定相同),忽略掉次要特征。

在过滤器向右平移时,如果原先的最大值还在过滤器与输入图像相交的范围内,那么新的最大值有可能不变,也就是新的区域内并没有出现更大的值,因此,最大池化可以使得图像具有少量的平移不变性。

最大池化通常在前面(浅层)的神经网络层使用,因为这个时候输入图像可能有很多不重要的特征,我们需要提取其中的主要特征,缓解神经网络过拟合。

在所有的池化操作中,最常使用的就是最大池化,甚至只有最大池化而无其他池化。

平均池化
平均池化

在过滤器与输入图像对应的位置,选取输入图像对应位置内的所有元素值的平均值,映射到输出图像上的一个元素中,映射方式与卷积层一样。

反向传播

平均池化可以视为对输入图像的特征进行平均,依旧考虑图像的所有特征。

在过滤器向右平移少量时,平均池化的结果可能不变或变化量很小,因为大部分时候图像不会出现明显的颜色变化,颜色变化通常都有一个过渡。因此,平均池化可以使得图像具有少量的平移不变性。

平均池化通常在后面(深层)的神经网络层使用,因为这个时候网络层很深,我们已经损失了很多数据特征了,现在的每个特征可能都很重要,不能随意地忽略掉一些特征。

池化操作的特点

池化操作需要保证过滤器的通道数量和输入图像的通道数量相同,并且池化操作是在二维上进行的,也就是不同的通道的数据并不会一起考虑,而是分开考虑,因此,池化操作不会改变图像的通道数。

池化通常选取\(2\times2\)的卷积核,步幅为2,因此,池化通常能够将输入图像长度和宽度缩减一半。

池化不会改变通道数

池化层的作用

卷积层依旧会对像素位置比较敏感,而池化可以增加平移不变性的特点,比如最大池化操作,会选取附近像素点中最大的值,如果这个值在比较小的范围平移,最大池化输出的也依旧是这个值。

池化也可以将图像进行一定的缩放,这是主要作用,可以很大程度上的减小计算量,其实不用池化层,对预测的精度并不会产生什么不好的影响。现在显卡算力越来越强,池化层应用的越来越少。

全连接层

在卷积神经网络的最后几层,为了实现分类器的功能,我们很可能需要使用到softmax模块,因此,卷积神经网络的最后几层很可能时全连接层。全连接层可以设置几层,然后最后一层是一个softmax分类器。

当然,全连接层还能帮助我们实现一些其他的功能,比如预测物体的位置、预测人物动作等等。

如果我们决定在卷积网络中使用全连接层,就必须保证输入的图像大小一定,因为全连接层的参数个数是固定的,选择的连接方式也是固定的,如果改变输入图像大小,相当于改变了特征数,在卷积层和池化层,改变输入图像的大小,输出图像也会改变,当特征图像传播到全连接层时,也就会改变全连接层输入的特征个数,而全连接层并没有卷积层和池化层的灵敏性,它对输入特征的个数要求在我们一开始确定网络模型时就固定了。

当然,如果我们不希望输入图片大小被局限,我们也可以去掉全连接层,而是用卷积层或者池化层来替代全连接层,这种神经网络被成为全卷积网络(FCN),其主要作用是进行图像分割,这个我们以后再讨论。

深度卷积网络的特点

深度卷积网络,通常有如下特点:随着神经网络的不断加深,输出图像的高度和宽度不断减小,但输出图像的通道数不断增加。

经典的CNN模型、残差模型、Inception模型等等,通常都具有这个特点。


卷积神经网络
https://blog.shinebook.net/2025/03/15/人工智能/理论基础/深度学习/卷积神经网络/
作者
X
发布于
2025年3月15日
许可协议