卷积神经网络
1. 卷积与池化
1.1 图像中的卷积
我们以图像为例来直观的理解卷积。
计算机中的图像通常都是按照像素点以离散的形式存储的,可以用一个二维或三维的矩阵来表示。假设对于一个二维的图像X∈R^ (HxW),卷积核为G∈R ^ (kxk),通常K为奇数。
则有,先将卷积核旋转180度,然后在输入中的对应位置取一个大小为k*k的区域,与旋转后的卷积核求内积,得到对应位置的输出。
1.2 卷积的意义
卷积的意义在于可以将时域中复杂的卷积运算转化为频域中简单的相乘运算,即:
要理解卷积定理,还需要先知道傅里叶变换。
傅里叶变换是将时域中的数据转换到频域中的一种方法,它将函数分解为一系列不同频率的三角函数的叠加,可以理解为从另一个维度去观察数据。
将图像和卷积核都变换到频域中,变换后,卷积核作为一个滤波器,对变换后的频域图像进行处理,当卷积核对应的滤波器是一个低通滤波器时,进行图像处理时会过滤掉一些较高的频率,如果将经过滤波器后的频域图像变换回像素空间,我们就会看到一些细节丢失了,这是因为高频对应着剧烈变化的区域,也就是图像的边缘、细节等。
1.3 深度学习中的卷积操作
-
单通道卷积
深度学习中,卷积核不需要进行显示翻转,这个定义在信号处理中称为互相关。
其具体的计算过程可参照下述连接的第一部分动态图:
形象理解深度学习中八大类型卷积
正如之前所介绍的,每个卷积和提取输入的某种特征,为了增加特征的丰富程度,我们常常会使用多个卷积核,即G={G0,G1,·····,G ^(c-1)},G ^i∈R ^ (kxk),将输入与每个卷积核得到的多个结果拼接起来,我们称卷积得到的输出位特征图。
当输入是5×5大小的矩阵,而使用一个3×3大小的卷积核进行卷积计算时,我们会发现:输入维度在卷积之后减小了,这个问题是由输入的边界导致的,卷积的起始位置无法取到输入的每一个位置。这会带来以下两个问题:
- 当进行多次卷积运算后,输出的尺寸会越来越小;
- 越是边缘的像素点,对于输出的影响越小,因为卷及运算在移动到边缘的时候就结束了。中间的像素点会参与多次计算,但边缘的像素点可能只会参与一次运算,这就导致了边缘信息的丢失。
为了解决上述问题,通常对边缘使用0值进行填充(padding),使得边缘处的像素值也能进行计算,从而使得输入维度与输出维度保持一致。
那么需要填充多少个0值呢?
0值的多少实际上与卷积核的形状相关,对于长和宽都是k的卷积核,需要取P=[k/2],方便使得输入的形状与输出的长宽一致。
输出的特征图大小不仅仅与padding有关,还与卷积方式有关。之前讨论的都是标准的卷积操作,也就是输入的每个位置都参与计算,有时不必每个位置都参与计算,可以每个几个位置计算一次,这个间隔称为步长(stride)。
-
多通道卷积
卷积方式依旧可以参考下述连接:
形象理解深度学习中八大类型卷积
-
池化
池化操作的主要目的是降维,以降低计算量,并在训练初期提供一些平移不变性。常用的两种池化操作是平均池化和最大值池化。
池化操作就是使用一个固定大小的滑窗在输入上滑动,每次将滑窗内的元素聚合为一个值输出。根据聚合方式的不同,可以分为平均池化和最大值池化,演示如下:
2. 卷积神经网络
2.1 卷积神经网络的结构
我们以AlexNet为例介绍一下卷积神经网路的结构。
AlexNet由5个卷积层,2个池化层,3个全连接层组成。
························································································································
输入层
:是224x224x3大小的图像;
第一层
:
卷积层
,卷积核大小为11×11,输出为96个特征图。输入为3个通道,卷积核的维度为R^(11x11x3x96),同时滑动步长stride=4,填充padding=2,根据公式:
那么输出的特征图大小为:
因此输出的特征图为H^(1)∈ R ^(55x55x96)。卷积之后使用ReLU激活函数。
第二层
:
池化层
,使用的是最大值池化,其中池化窗口大小为3×3,步长为2,使用与卷积类似的方式,可以计算得到输出大小为
(55-3)/2+1=27,
因此池化层输出为H^(2)∈ R ^(27x27x96)。
第三层
:
卷积层
,卷积核大小为5×5,输出为256个特征图,因此卷积核的维度为R^(5x55x96x256),同时滑动步长stride=1,填充padding=2,由
得,输出的特征图大小为H^(3)∈ R ^(27x27x96)。同样的,卷积之后使用ReLU激活函数。
第四层
:
池化层
,使用的是最大值池化,其中池化窗口大小为3×3,步长为2,计算得到输出大小为(27-3)/2+1=13,因此池化层输出为H^(4)∈ R ^(13x13x256)
第五到第七层
:
卷积层
,卷积核大小为3×3,输出分别为384、384、256个特征图,滑动步长stride=1,填充padding=1,因此第七层输出H^(7)∈ R ^(13x13x256)。同样的,卷积之后使用ReLU激活函数。
第八层
:
池化层
,窗口大小为3×3,步长为2,计算得到输出大小为(13-3)/2+1=6,因此池化层输出为H^(8)∈ R ^(6x6x256)
最后三层
:
全连接层
,将卷积的输出H^(8)∈ R ^(6x6x256)展平,得到全连接层的输入维度为R ^ 9216,三层全连接的神经元个数为4096、4096、1000。最终得到1000维的输出用于图像分类。
························································································································
卷积神经网络的结构一般可以分作两个部分:一部分是由卷积层和池化层交替堆叠构成的骨干网络,它主要用于
从输入中提取丰富的特征
;另一部分是全连接层,它将卷积得到的特征图展平,也就是说丢弃了特征图的空间信息,它的主要作用是
聚合全局信息并将其映射到输出空间
,比如AlexNet就是用于分类。一般的卷积结构也是有这两部分构成的。
2.2 卷积神经网络的特点
卷积神经网络具有以下3个特点:
-
局部连接
由于图像通常具有局部相关性,因此卷积计算每次只在与卷积和大小对应的区域进行,也就是说输入和输出是局部连接的。
如果使用多层感知器来处理图像,一种简单的思路是将多维度的输入图像变换为一个向量并作为多层感知器的输入,对于大小为224x224x3的图像,拉平为一个向量作为输入将会需要150528个神经元。如果第一个隐藏层神经元数量为32,那么将会引入480万个参数,这么大的参数量会带来两个问题:第一,计算复杂度高;第二,有过拟合的风险。如果使用3×3的卷积核,输出的通道数为32,引入的参数量在1000以下,远远小于多层感知器需要的参数。
感知野的示意图:
-
权值共享
在图像中,不同的区域使用相同的卷积核参数,这一方面减少了参数量,另一方面带来了平移不变性。
所谓平移不变性是指:不管输入如何平移,总能够得到相同的输出。 -
层次化表达
卷积网络通过卷积层堆叠得到,每一层都是对前一层进行变换,提取的特征从低层次到高层次,逐渐变得抽象。
低层次的卷积一般是提取一些简单的特征,比如颜色、边缘、角等,它的感知野相对较小,对应的都是局部性特征;
中间层次的卷积得到的特征开始变得抽象,比如纹理结构等;
高层次的卷积得到的特征更加抽象,与图像的语义、具体包含的目标相关,由于它的感知野更大,因此它是更加全局性的特征。
高层次的特征是在低层次特征的基础上的得到的,通常来说,低层次的特征更加通用,高层次的特征与具体的任务关联性更强。
3. 特殊的卷积形式
3.1 1×1卷积
1 x 1卷积中将一个数字乘以输入层中的每个数字。
如果输入层有多个通道,此卷积会产生有趣的作用。下图说明了1 x 1卷积如何适用于尺寸为H x W x D的输入层。在滤波器尺寸为1 x 1 x D的1 x 1卷积之后,输出通道的尺寸为H x W x 1。如果我们应用N这样的1 x 1卷积然后将结果连接在一起,我们可以得到一个尺寸为H x W x N的输出层。
在上图中可以观察到两个优点:
降低维度以实现高效计算、高效的低维嵌入。假设原始输入有200个通道,1 x 1卷积会将这些通道(功能)嵌入到单个通道中。而且在1 x 1卷积之后,可以添加诸如ReLU的非线性激活函数,非线性允许网络学习更复杂的功能。
3.2 转置卷积
转置卷积,它是语义分割任务中必不可少的模块。
语义分割指的是对图像在
像素级别
上进行分类,属于同一类别的像素通常对应着某个目标,例如照片中属于人的像素需要分类为同一类别。
····························································分割线····························································
基于CNN的语义分割模型通常都由两部分组成:
一部分是编码器,用于将原始的输入图像映射到某个低维的特征空间中,它既需要编码目标的特征信息,也要编码位置信息,以正确的预测每个像素位置的类别。
另一部分是解码器,它将编码的低维特征映射回像素空间,以对每个像素的具体类别进行判断。
其中,解码器部分我们不能使用之前所介绍的标准卷积,因为之前的卷积操作不会使得特征图的长宽维度增加,而转置卷积则相反,它可以完成长宽维度的增加,将编码的低维特征逐步映射回像素空间。
····························································分割线····························································
对于步长s,卷积核大小为k的转置卷积,在进行计算时将默认在输入四周填充k-1圈0,而设置的padding,将会影响最后填充的大小,具体的填充值由k-1-p给出。对于步长s,它是在
元素之间
插入s-1个0。
对于转置卷积中输入维度,卷积核大小、填充以及步长与输出维度的关系为:
3.3 空洞卷积
空洞卷积通过在卷积核元素之间插入空格来“扩张”卷积核,其中有个超参数用于控制扩张的程度,称为空洞率r(dilation rate),指的是在卷积核中间插入r-1个0,因此对于原先大小为k的卷积核,在使用空洞卷积之后实际的卷积核大小变为k+(k-1)(r-1).
由于卷积核扩大,感知野也会扩大。因此空洞卷积是一种不增加参数量而可以快速增大感知野的有效方式。