卷积神经网络(convolutional neural network, CNN)
基本定义卷积神经网络(convolutional neural network, CNN),是一类包含卷积计算且具有深度结构的前馈神经网络。卷积神经网络是受生物学上感受野(Receptive Field)的机制而提出的。卷积神经网络专门用来处理具有类似网格结构的数据的神经网络。例如,时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网格) 和图像数据(可以看作是二维的像素网格)。1.卷积层(
基本定义
卷积神经网络(convolutional neural network, CNN),是一类包含卷积计算且具有深度结构的前馈神经网络。卷积神经网络是受生物学上感受野(Receptive Field)的机制而提出的。卷积神经网络专门用来处理具有类似网格结构的数据的神经网络。例如,时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网格) 和图像数据(可以看作是二维的像素网格)。
1.卷积层(convolutional layer)
作用:特征提取
卷积层内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量。卷积核的所覆盖的区域,被称为“感受野(receptive field)”。
1.1卷积
1.1.1 卷积与互相关
卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,与数学分析中的卷积定义有所不同,使用互相关运算作为卷积的定义。
互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。而卷积则需要将滤波器经过反转。以二维为例,给定一个图像:X∈RM×N\mathbf X \in \mathbf R^{M\times N}X∈RM×N,和一个滤波器 :W∈RU×V\mathbf W \in \mathbf R^{U\times V}W∈RU×V;
则互相关为:yij=∑u=1U∑v=1Vwuvxi+u−1,j+v−1\displaystyle y_{ij}=\sum^U_{u=1}\sum^V_{v=1}w_{uv}x_{i+u-1,j+v-1}yij=u=1∑Uv=1∑Vwuvxi+u−1,j+v−1;
卷积为:yij=∑u=1U∑v=1Vwuvxi−u+1,j−v+1\displaystyle y_{ij}=\sum^U_{u=1}\sum^V_{v=1}w_{uv}x_{i-u+1,j-v+1}yij=u=1∑Uv=1∑Vwuvxi−u+1,j−v+1;
1.1.2 一维卷积
一维卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发生器每个时刻 ttt 产生一个信号 xtx_txt ,其信息的衰减率为 wkw_kwk ,即在 k−1k−1k−1 个时间步长后,信息为原来的 wkw_kwk 倍。而在时刻 ttt 收到的信号 yty_tyt 为当前时刻产生的信息和以前时刻延迟信息的叠加,即:
yt=w1×xt+w2×xt−1+w3×xt−2=∑k=13wk⋅xt−k+1\begin{array}{ll} &y_t= w_1\times x_t + w_2\times x_{t-1}+w_3\times x_{t-2}\\ &\\ & = \sum^3_{k=1}w_k\cdot x_{t-k+1} \end{array}yt=w1×xt+w2×xt−1+w3×xt−2=∑k=13wk⋅xt−k+1
其中, wkw_kwk被称为滤波器(filter)或卷积核(convolution kernel)。
1.2 二维卷积
1.2.1 卷积计算
在图像处理中,图像是以二维矩阵的形式输入到神经网络中。给定一个图像:X∈RM×N\mathbf X \in \mathbf R^{M\times N}X∈RM×N,和一个滤波器 :W∈RU×V\mathbf W \in \mathbf R^{U\times V}W∈RU×V,且有U<<M,V<<NU<<M, V<<NU<<M,V<<N;其卷积为:yij=∑u=1U∑v=1Vwuvxi−u+1,j−v+1\displaystyle y_{ij}=\sum^U_{u=1}\sum^V_{v=1}w_{uv}x_{i-u+1,j-v+1}yij=u=1∑Uv=1∑Vwuvxi−u+1,j−v+1;具体计算过程如下图所示
一个输入信息 X\mathbf XX 和滤波器 W\mathbf WW 的二维卷积定义为:Y=W∗X\displaystyle Y=\mathbf W *\mathbf XY=W∗X。一个具体案例为如下:
假设卷积核的高和宽分别为 khk_hkh 和 kwk_wkw,则将称为 kh×kwk_h \times k_wkh×kw 卷积,比如 3×53\times 53×5 卷积,就是指卷积核的高为3, 宽为5。在卷积神经网络中,一个卷积算子除了上面描述的卷积过程之外,还包括加上偏置项的操作。
经过一次卷积之后,图片尺寸变小。卷积输出特征图的尺寸计算方法为:{Hout=H−kh+1,Wout=W−kw+1,\displaystyle \left\{ \begin{aligned} H_{out}=H-k_h+1, \\ W_{out}=W-k_w+1, \\ \end{aligned} \right.{Hout=H−kh+1,Wout=W−kw+1,
1.2.2 填充(padding)
当卷积核尺寸大于 1 时,输出特征图的尺寸会小于输入图片尺寸。如果经过多次卷积,输出图片尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding),如下图所示。
如果在图片高度方向,在第一行之前填充 ph1p_{h1}ph1 行,在最后一行之后填充 ph2p_{h2}ph2 行;在图片的宽度方向,在第1列之前填充 pw1p_{w1}pw1 列,在最后1列之后填充 pw2p_{w2}pw2 列;则填充之后的图片经过大小为 kh×kwk_h \times k_wkh×kw 的卷积核操作之后,输出图片的尺寸为:{Hout=H+ph1+ph2−kh+1,Wout=W+pw1+pw2−kw+1,\displaystyle \left\{ \begin{aligned} H_{out}=H+p_{h1}+p_{h2}-k_h+1, \\ W_{out}=W+p_{w1}+p_{w2}-k_w+1, \\ \end{aligned} \right.{Hout=H+ph1+ph2−kh+1,Wout=W+pw1+pw2−kw+1,
在卷积计算过程中,通常会在高度或者宽度的两侧采取等量填充,即 ph1=ph2=ph,pw1=pw2=pwp_{h1}=p_{h2}=p_{h},p_{w1}=p_{w2}=p_{w}ph1=ph2=ph,pw1=pw2=pw ,则变换后的尺寸变为{Hout=H+2ph−kh+1,Wout=W+2pw−kw+1,\displaystyle \left\{ \begin{aligned} H_{out}=H+2p_{h}-k_h+1, \\ W_{out}=W+2p_{w}-k_w+1, \\ \end{aligned} \right.{Hout=H+2ph−kh+1,Wout=W+2pw−kw+1,
卷积核大小通常使用1,3,5,7这样的奇数,如果使用的填充大小为 ph=(kh−1)2,pw=(kw−1)2\displaystyle p_h=\frac{(k_h−1)}{2} ,p_w=\frac{(k_w-1)}{2}ph=2(kh−1),pw=2(kw−1),则卷积之后图像尺寸不变。例如当卷积核大小为5时,padding大小为2,卷积之后图像尺寸不变。
1.2.3 步幅(stride)
步幅为卷积核每次滑动的像素点个数。下图是步幅为2的卷积过程,卷积核在图片上移动时,每次移动大小为2个像素点。
当宽和高方向的步幅分别为 shs_hsh 和 sws_wsw 时,输出特征图尺寸为 {Hout=H+2ph−khsh+1,Wout=W+2pw−kwsw+1,\displaystyle \left\{ \begin{aligned} H_{out}=\frac{H+2p_{h}-k_h}{s_h}+1, \\ W_{out}=\frac{W+2p_{w}-k_w}{s_w}+1, \\ \end{aligned} \right.⎩⎪⎪⎨⎪⎪⎧Hout=shH+2ph−kh+1,Wout=swW+2pw−kw+1,
1.2.4 感受野
输出特征图上每个点的数值,是由输入图片上大小为 kh×kwk_h\times k_wkh×kw 的区域的元素与卷积核每个元素相乘再相加得到的,所以输入图像上 kh×kwk_h\times k_wkh×kw 区域内每个元素数值的改变,都会影响输出点的像素值。我们将这个区域叫做输出特征图上对应点的感受野。感受野内每个元素数值的变动,都会影响输出点的数值变化。比如 3×33\times33×3 卷积对应的感受野大小就是 3×33\times33×3 。
而当通过两层 3×33\times33×3 的卷积之后,感受野的大小将会增加到 5×55\times55×5。当增加卷积网络深度的同时,感受野将会增大,输出特征图中的一个像素点将会包含更多的图像语义信息。
1.2.5 多输入通道场景
实际上一张图片往往含有RGB三个通道,要计算卷积的输出结果,卷积核的形式也会发生变化。假设输入图片的通道数为 CinC_{in}Cin ,输入数据的形状是 Cin×Hin×WinC_{in}\times{H_{in}}\times{W_{in}}Cin×Hin×Win,计算过程如下:
(1)对每个通道分别设计一个2维数组作为卷积核,卷积核数组的形状是 Cin×kh×kwC_{in}\times{k_h}\times{k_w}Cin×kh×kw;
(2)对任一通道 Cin∈[0,Cin)C_{in} \in [0, C_{in})Cin∈[0,Cin),分别用大小为 kh×kwk_h\times{k_w}kh×kw 的卷积核在大小为 Hin×WinH_{in}\times{W_{in}}Hin×Win 的二维数组上做卷积;
(3)将这 CinC_{in}Cin 个通道的计算结果相加,得到的是一个形状为 Hout×WoutH_{out}\times{W_{out}}Hout×Wout 的二维数组。
1.2.6 多输出通道场景
一般来说,卷积操作的输出特征图也会具有多个通道 CoutC_{out}Cout,这时需要设计 CoutC_{out}Cout 个维度为 Cin×kh×kwC_{in}\times{k_h}\times{k_w}Cin×kh×kw 的卷积核,卷积核数组的维度是 Cout×Cin×kh×kwC_{out}\times C_{in}\times{k_h}\times{k_w}Cout×Cin×kh×kw,如下图所示。卷积核的输出通道数也被叫做卷积核的个数。
在一个卷积层中,一个卷积核可以学习并提取图像的一种特征,但往往图片中包含多种不同的特征信息,因此我们需要多个不同的卷积核提取不同的特征。
1.2.7 批量操作
在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作,即输入数据的维度是 N×Cin×Hin×WinN\times{C_{in}}\times{H_{in}}\times{W_{in}}N×Cin×Hin×Win。由于会对每张图片使用同样的卷积核进行卷积操作,卷积核的维度与上面多输出通道的情况一样,仍然是 Cout×Cin×kh×kwC_{out}\times C_{in}\times{k_h}\times{k_w}Cout×Cin×kh×kw,输出特征图的维度是 N×Cout×Hout×WoutN\times{C_{out}}\times{H_{out}}\times{W_{out}}N×Cout×Hout×Wout,如下图所示。
1.3 性质
在图像处理中 ,卷积经常作为特征提取的有效方法。卷积滤波器的参数需要学习。
1.3.1 局部连接
在卷积层(假设是第𝑙𝑙层)中的每一个神经元都只和下一层(第 𝑙−1𝑙−1l−1 层)中某个局部窗口内的神经元相连,构成一个局部连接网络。使用卷积层代替全连接层,可以使得层和层之间的连接数大大减少,由原来的 Ml×MlM_l\times M_lMl×Ml 个连接变为 Ml×KM_l\times KMl×K 个连接,KKK为滤波器大小。
如,一维全连接层和卷积层:
二维全连接层和卷积层:
1.3.2 稀疏交互
在全连接的神经网络中,隐含层中的每一个节点都和上一层的所有节点相连,同时又被连接到下一层的全部节点。而卷积层不同,节点之间的连接性受到卷积核大小的制约。如下图所示,与全连接网络不同,相邻两层中,x3x_3x3 只能影响卷积核尺寸大小的节点(即图中的 s2,s3,s4s_2,s_3,s_4s2,s3,s4 节点)。我们可以看出节点 s3s_3s3 受到节点 x2,x3,x4x_2,x_3,x_4x2,x3,x4 的影响,这些节点被称之为 s3s_3s3 的感受野 (receptive field)。
尽管一个节点在一个层级之间仅与其感受野内的节点相关联,但是对于深层中的节点,其与绝大部分输入之间却存在这间接交互,如下图所示。节点 g3g_3g3 尽管直接的连接是稀疏的,但处于更深的层中可以间接的连接到全部或者大部分的输入节点。这就使得网络可以仅通过这种稀疏交互来高效的描述多个输入变量之间的复杂关系。
1.3.3 权重共享
作为参数的滤波器 w(l)w(l)w(l) 对于第 lll 层的所有的神经元都是相同的。如上图卷积层中,只有一个滤波器完成特征图抽取。权重共享可以理解为一个滤波器只捕捉输入数据中的一种特定的局部特征。因此,如果要提取多种特征就需要使用多个不同的滤波器。
正是由于权重共享机制,使得卷积层具有 平移等变 (equivariance) 的性质。对于函数 f(x)f(x)f(x) 和 g(x)g(x)g(x),如果满足 f(g(x))=g(f(x))f(g(x))=g(f(x))f(g(x))=g(f(x)) ,就称 f(x)f(x)f(x) 对于变换 ggg 具有等变性。即 对于图像如果我们将所有的像素点进行移动,则卷积后的输出表示也会移动同样的量。
2.池化层(pooling layer)
作用:降维(大幅降低参数量级)——特征选择和信息过滤。
池化层,也称汇聚层、子采样层,其主用作用是进行特征选择,降低特征数量,从而减少参数数量。池化相当于在空间范围内做了维度约减,分别作用于每个输入的特征并减小其大小。
池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。
2.1 池化操作
池化通常有两种:平均池化和最大池化。
与卷积核类似,池化窗口(用 kh×kwk_h\times k_wkh×kw 表示池化窗口)在图片上滑动时,每次移动的步长称为步幅,当宽和高方向的移动大小不一样时,分别用 sws_wsw 和 shs_hsh 表示。也可以对需要进行池化的图片进行填充,填充方式与卷积类似,假设在第一行之前填充 ph1p_{h1}ph1 行,在最后一行后面填充 ph2p_{h2}ph2 行。在第一列之前填充 pw1p_{w1}pw1 列,在最后一列之后填充 pw2p_{w2}pw2 列,则池化层的输出特征图大小为:{Hout=H+ph1+ph2−khsh+1,Wout=W+pw1+pw2−kwsw+1,\displaystyle \left\{ \begin{aligned} H_{out}=\frac{H+p_{h1}+p_{h2}-k_h}{s_h}+1, \\ W_{out}=\frac{W+p_{w1}+p_{w2}-k_w}{s_w}+1, \\ \end{aligned} \right.⎩⎪⎪⎨⎪⎪⎧Hout=shH+ph1+ph2−kh+1,Wout=swW+pw1+pw2−kw+1,
通常使用 2×22\times22×2 大小的池化窗口,步幅也使用2,填充为0;通过这种方式的池化,输出特征图的高和宽都减半,但通道数不会改变。
2.2 池化层的作用
池化层(汇聚层)不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野。如下图所示:
3. 全连接层(fully-connected layer)
作用:对提取的特征进行非线性组合以得到输出。
全连接层本身不具有特征提取能力,而是使得目标特征图失去空间拓扑结构,被展开为向量。
4. 其他的卷积方法
4.1 转置卷积
卷积操作实现高维特征到低维特征的转换,但若需要将低维特征映射到高维特征,并且依然希望通过卷积操作来实现,这种卷积被称为转置卷积(Transposed Convolution)。如,通过填充 2∗22*22∗2 的零元素,将 2∗22*22∗2 的输入上采样为 4∗44*44∗4:
具体解释操作如下:
4.2 微步卷积
可以通过增加卷积操作的步长 𝑆>1𝑆>1S>1 来实现对输入特征的下采样操作,大幅降低特征维数;
也可以通过减少转置卷积的步长 𝑆<1𝑆<1S<1 来实现上采样操作,大幅提高特征维数。步长 𝑆<1𝑆<1S<1 的转置卷积称为微步卷积(Fractionally-Strided Convolution)。为了实现微步卷积,我们可以在输入特征之间插入0来间接地使得步长变小。
4.3 空洞卷积
空洞卷积(Atrous Convolution)是一种不增加参数数量,同时增加输出
单元感受野的一种方法,也称为膨胀卷积(Dilated Convolution)。空洞卷积通过给卷积核插入空洞来增加其大小。如果在卷积核的每两个元
素之间插入 D−1D-1D−1 个空洞,卷积核的有效大小为:K′=K+(K−1)×(D−1)\displaystyle K^{'}=K+(K-1)\times (D-1)K′=K+(K−1)×(D−1)。其中 D 称为膨胀率(Dilation Rate)。D=1时卷积核为普通的卷积核。
5.CNN的特点及解决的问题
在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:
(1)图像需要处理的数据量太大,导致成本很高,效率很低;图像是由像素构成的,每个像素又是由颜色构成的。随便一张图片都1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息,即处理一张1000×1000 像素的图片,我们就需要处理三百万参数。CNN 解决的第一个问题就是“将复杂问题简化”,把大量参数降维成少量参数,再做处理。
(2)图像在数字化的过程中很难保留原有的特征(如下图所示),导致图像处理的准确率不高。
从视觉的角度来看,图像的内容(本质)并没有发生变化,只是位置发生了变化。用传统的方式的得出来的参数会差异很大。而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
更多推荐
所有评论(0)