【CNN】初识卷积

前言

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。

对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被应用于计算机视觉、自然语言处理等领域。

卷积神经网络仿造生物的视觉(visual perception)机制构建,可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)。

一、卷积神经网络

1.1 核概念与卷积操作:

【CNN】初识卷积_第1张图片
如上图所示:g(x,y)即为核(kernel),每个小方格上都有一个标量代表权重w。f(x,y)为输入图像的像素矩阵,每个小方格上都有一个标量代表该图片在该点上的像素值。图像中卷积操作定义为kernel中的元素g(x,y)与输入数据f(x,y)对应元素进行相乘求和的操作。

(1)在上图示例中,与kernel中的权重w对应的一共有9个元素(input中的蓝色元素),相乘求和的结果即为卷积操作的输出。

(2)kernel中的权重w就是卷积神经网络训练需要求得的参数。

此外,通过上图可以发现,由于kernel的尺寸一般都远远小于图像的像素矩阵尺寸,因此,只对图像进行一次卷积操作只能处理图像中的一小部分信息,这肯定是不合理的。所以,使用卷积处理图像还有多个滑动便利的过程,如下面动图所示:卷积核会从图像的起始位置(左上角)开始,以一定的顺序(从左到右,从上到下)遍历整张图像,每滑动一次就与对应的位置做一次卷积操作直到遍历到最终位置(右下角),这个过程叫做卷积对图像的一次处理。其中,kernel每次滑动的像素大小被定义为步幅(stride),动图中的stride=2。
【CNN】初识卷积_第2张图片
需要注意:卷积核从图像的初始位置(左上角)滑动到最后位置(右下角)这个过程中,卷积核中的参数是不会发生改变的,这叫做参数共享,是卷积操作的重要性质之一。如下图所示,左边是参数独立的情况,即核每滑动一次,其中的参数就要重新计算,右面则是参数共享的方式,也是卷积操作所采用的方式。
【CNN】初识卷积_第3张图片
这样做的目的从某种角度来说是在模仿人类的一种视觉习惯:平移不变性。在图像中,只要是同一种特征,那么不管这个特征被平移到图像中的什么位置,我们人类都能做很好的识别。实际上,卷积的设计是天然符合这个特性的:首先,卷积核在输入信息上做卷积的目的就是为了识别某一种特征,其次,由于滑动遍历的原因,不管要识别的特征出现在图片中的什么位置,卷积都可以通过滑动的方式,滑动到该特征的上面进行识别。但是,这有一个前提,就是该卷积核从图像的起始位置滑动结尾位置这个过程中,寻找的都是都一种特征。这个前提可以通过参数共享的方式实现,即卷积核在对图像做一次完整的遍历过程中不发生改变,一个不变的卷积核寻找的肯定是同一种特征了

卷积的定义是两个变量在某个范围内相乘后求和的结果。对应图中就是让核与输入两个平面平行对应,每个对应点进行相乘后求和,得到的值作为输出。
核概念早在计算机视觉中得以应用,通过设定不同的核大小及权值可以实现对图片的处理,如图片锐化,图片模糊化,图片边缘化等等。
【CNN】初识卷积_第4张图片
深度学习中的核概念不同与计算机视觉中不同的一点为:在计算机视觉中用于处理图片的不同核大小可能是通过经验得来的。而深度学习中核的权值大小是模型自己学习总结出的。

1.2 填充(padding)

经过对卷积处理图像的方式和核概念的认识,我们可以将卷积神经网络理解为一个kernel在输入图片上遍历的过程,遍历过程中kernel与输入信息之间的对应点的乘积求和即为卷积输出。而且输出结果的尺寸是要小于输入信息的,除非卷积核的大小的1x1的,具体如下图所示。
【CNN】初识卷积_第5张图片

很多情况下,我们希望在不使用1x1大小卷积核的前提下,可以调整卷积输出结果的尺寸。此时可以在输入信息的四周填充一圈新像素(一般填充0值像素),使卷积核遍历图片后得到的卷积输出大小不变。填充的像素多少与卷积核的尺寸大小成正相关。如下图所示,当卷积核尺寸为3,步长大小为1时,需要填充一行一列像素可以使得输出大小与输入信息一致:

最后,卷积计算结果的尺寸与卷积核,步长,填充和输入信息尺寸这四个因素相关。
我们先定义几个参数:
(1)输入图片大小 W×W
(2)卷积核大小 F×F
(3)步长 S
(4)padding的像素数 P
于是我们可以得出卷积结果的尺寸计算公式为:
N = (W − F + 2P )/S+1
即,卷积输出结果的尺寸为 N×N。

1.3 通道 (channel)

我们可以将一个图片数据集抽象为四维[数量,长,宽,色彩],每个维度都是一个通道的概念,一个通道中往往存储相同概念的数据。例如对于一张32x32分辨率的彩色照片来讲,我们一般将其抽象为向量[1,32,32,3], 3指的是RGB三个颜色通道。颜色通道的原理:三原色,即世界上任何一种色彩都可以使用红色,绿色和蓝色三种颜色调配得到。因此计算机在存储彩色图像时,也借鉴了这一原理,其存储模式是三个相同大小的像素矩阵一同表征一张彩色图像,如下图所示。
【CNN】初识卷积_第6张图片
从图中可以发现,卷积核的维度与输入图像的维度相同,也是四维信息,其维度是[3,kernel_H , kernel_W,3] 。第一个维度的3,对应图中的三个卷积核。第二维度和第三维度对应着卷积核的尺寸。第四维度的3,对应的是卷积核的通道数目。需要注意的是,卷积核的通道数量与输入信息的通道数量是相等的,这是因为在一次卷积操作中,一个卷积核的通道与一个输入信息的通道做卷积操作,每个通道一一对应,如图中的灰色箭头所示。在示例中,一个卷积核的三个通道会计算得到三张特征图,这三个特征图最后对应位置求和会得到一个计算结果,即不管一个卷积核的通道数量是多少,一个卷积核只能计算得到一张特征图。

除此之外,为了保证模型的学习能力,我们一般会设计多个卷积核,尝试去图像中分别提取不同的特征,在上图示例中,一次卷积操作使用n个卷积核,这n个卷积核会计算得到n个特征图,它们一起作为这次卷积的计算结果。

这里一定要明确的是每一次卷积的维度变化,假设:输入信息的维度是 [1, 32, 32, 3],卷积核的维度是 [4,3 , 3,3] ,卷积操作的步长为1,填充也为1。那么每一个卷积核都会得到 [1, 32, 32, 1] 的输出结果。最后,由于我们有4个不同的卷积核,将四个 [1, 32, 32, 1] 拼到一起才得到维度 [1, 32, 32, 4]。通道4解释为因为有4个核所以对应4个不同输出。

最后,回归通道的概念。刚刚解释过计算机要表示整张彩色图片,需要RGB三个颜色通道。实际上,一个数据的通道可以是任意整数,在深度学习模型中,往往是成百上千的,这怎么理解呢?
其实,每个通道存储的都是一个概念,例如,单通道时可以存储图像的像素值;通道维度为2时,可以存储图像的平面坐标;通道维度为3时,可以存储图像的颜色信息;类比下去,对于多通道我们可以看做是图像更抽象的版本,每一个通道都表示图像某一方面的信息

1.4 池化与采样

从某种程度上,池化可以看作特殊的卷积,因为卷积中常见的概念(kernel,padding,stride,slidding)池化操作都有;只有一个地方特殊,即池化的核与输入信息的对应位置元素做的操作不同,在卷积里这个操作是相乘求和,在池化里这个操作是求平均或最大,分别对应平均池化和最大池化(Average pooling和Max pooling)。 如下图示例所示:
【CNN】初识卷积_第7张图片
上图中,池化的核是绿色的框,大小为2x2;原始输入数据的填充为0,因为在原始数据的四周并没有像素填充;池化操作的步长为2 ,即初始位置为黄色部分,滑动后到了红色的部分,滑动了两个像素位置。

至于左下角的2x2矩阵为平均池化的结果,例如第一个元素2的计算过程为 (1+3+1+3)/4,即池化的核与输入信息的对应位置做平均的结果;而左下角的2x2矩阵为最大池化的结果,例如第一个元素3的计算过程为 max(1,3,1,3),即池化的核与输入信息的对应位置比较取最大的结果。

池化的主要用途是在保证原始特征信息的同时,进行特征的降维,压缩数据和减少参数。在一定程度上可以减轻过拟合现象,同时提高模型的容错性。比如以(3,3)作为一个池化单位,其含义就是每次将3*3=9个特征值根据池化算法合并成一个特征值。采样方式分为上采样和下采样。常用的下采样池化算法有Average pooling和Max pooling。

上采样可以起到将信息等比放大的作用,放大的倍数与池化的大小有关。如下图将信息等比放大两倍。
【CNN】初识卷积_第8张图片

二、卷积的设计思想

2.1 参数量的角度

众所周知,在全连接神经网络中,全连接神经网络随着隐藏层和隐藏节点的增加,参数的增加量是十分巨大的。正是因为这些大量的参数,使得神经网络模型有着极强的学习能力,但是也造成了计算的困难。因为训练神经网络相当于给网络布置了一个任务,为了完成任务,我们给网络设置了很多参数让它去学习;类比人类自己去理解的话,我们可以用学生做比喻:给学生布置了一个任务目标,为了学生达到这个目标,老师给学生布置的大量的作业让他去完成,其实学生是难以在短时间内把这大量的作业都认真完成的(因为任务量太大)。这就像模型不能再短时间内训练好大量的参数是一样的。

卷积神经网络的发明很好地解决了这一问题。为了很好的了解卷积的概念,我们可以先从生物学的角度进行理解。当我们欣赏一幅图片的时候,大概有两种欣赏方式。其一是纵观全局,这便相当与全连接神经网络方式;其二是关注局部,然后保证观察角度不变,进行上下左右平移,来观察整张图片,这便相当于卷积神经网络。如下图所示:
【CNN】初识卷积_第9张图片
图 2.1.1

每个圆圈可理解为隐藏层的结点,连线的角度可以抽象成权值W。当以全连接层方式观察时,每变换一个结点,相当于变换一个观察角度,所有的连线角度都会改变,造成了所有的W都不一样,所以全连接层的参数会很多。反观卷积层方式,当选定一个kernel(即图中彩色长方形区域)大小时,可以通过kernel的上下左右移动来遍历整张图片,在此过程中,连线的角度不变,即权值w的大小不变,由次可以解释卷积方式参数大量下降的原理。

2.2平移不变性的角度

其次,从图像的性质来说,卷积的设计天然符合图像的局部相关性。首先关于图像的局部相关性的理解我们可以列举一个场景:
我们从图2.1.1的眼睛附近随机选取一个像素值a1,如果单独的把a1从图像的像素矩阵中拿出来,那么a1仅仅只是一个数值,它代表不了任何东西是没有意义的;但是,如果把a1再放回原本的像素矩阵中,那么它就可以跟周边的像素值一起表示眼睛这一特征,这叫做相关性。此外,考虑离a1相距较远的其他像素值a2(例如图像右下角衣服中的像素值),由于两个像素在原图中的距离较远,他们之间的联系也是比较小的,这就体现的局部。因此,图像是一种局部相关的数据,在此性质的背景下,全连接神经网络这种计算全局信息的方式反而是冗余的,不符合图像性质的;而卷积处理局部的方式则显的更加合理。

卷积神经网络在图片识别上意义重大,它的意义远不止减少参数量这一点。实际上,对图片进行卷积操作就是把卷积模板(kernel)与原图片做点积操作。点积的数学解释可以解释为:两个向量之间的相似度。推广到这里,可以说成kernel与原图的相似度卷积的结果越大,说明图片中某位置和kernel的相似度越大,反之亦然。如果把kernel作为特征算子或者特征向量,那么卷积的过程就是通过移动kernel在原图中的对应位置,不断去寻找原始数据中是否存在跟kernel表征相似的特征,这在图片识别中意义重大。打个比方,我们判断一张图片是否为车子,假设我们的卷积模型设置了4个kernel,它们的特征可能代表[轱辘,车窗,方向盘,车门],通过kernel在原图上进行匹配进而综合判断图像中是否存在这四种特征,如果存在则该图片大概率是车子。

实际上,深度卷积神经网络就是去求解这千千万万个kernel的这么一种网络。这些kernel不是凭借我们的经验随便定义的,而是通过网络不断的学习更新参数得来的。而卷积神经网络的不易解释性就在于此,随着模型的复杂,抽象出的kernel千千万万,我们难以去解释每个kernel的具体含义,也难以介绍每个中间层和中间结点的含义。

2.3人类的视觉习惯

最后,我们可以从人类的视觉习惯来理解卷积的设计思想。相较于全连接神经网络,卷积神经网络的计算方法更符合人类的视觉习惯。我们可以想象一个场景:当我们突然置身于一个复杂且陌生的环境,那么,我们是怎么快速的获得周边信息的?

如果以神经网络的方式,由于神经网络的计算是全局性的,为了模仿这一性质,我们在观察场景时需要同时的观察全局,思考全局。这其实并不是人类视觉的观察习惯。我们往往会选择先观察一个局部的你感兴趣的区域,观察时,只需要思考这个局部区域有什么即可。之后,再会选择左看看,右看看,看到哪里思考到哪里,通过有规律的扫视对全局做完整的观察。这其实与卷积神经网络先观察局部,再通过滑动的方式遍历全局,滑动到哪里就计算到哪里是一样的。所以说,卷积的设计是更符合人类的视觉习惯的。

三、卷积对图像的特征提取过程

让我们来看一个例子: 如下图所示,是一个识别字母X的图像识别示例。在图像的像素矩阵中,白色的像素块值为1,黑色的像素块值为负1。在图像上方的三个小矩阵分别是三个不同的卷积核。现在,我们使用第一个卷积核去图像中进行滑动遍历;当这个卷积核滑动到图中绿色框框住的位置时,其卷积计算结果等于9,此时9为这个3*3卷积核能够计算得到的最大值。
【CNN】初识卷积_第10张图片
继续思考,当在绿色框的附近做卷积操作时,卷积计算结果应该是比9要小的数值,例如下图红色框的例子(向右滑动一个像素位置):卷积计算结果为 -1
【CNN】初识卷积_第11张图片
现在,我们继续滑动卷积核,直到滑动到如下图黄色框所示的位置时,其卷积计算结果又等于9 。观察一下,上图所示的第一个卷积核和绿色位置以及黄色位置是否有什么联系?答案很简单,它们长的一模一样!
【CNN】初识卷积_第12张图片
因此,答案就出来了:第一个卷积核就是去图像里滑动遍历,然后寻找一个是否有跟它长的一模一样的这种对角特征;如果找到了,例如图中绿色和黄色位置,那么卷积计算结果就是最大值;如果没有找到,那么卷积计算结果就是一个非极大值;通过极大值与非极大值的区分,就可以完成这种对角特征与其他特征的区分卷积就是通过这种方法对输入信息进行特征提取的。简而言之,我们可以把卷积核看作识别某种特征的模式,卷积核的目的就是尝试去图像中提取这种特征。

需要注意的是,在一个卷积操作中,我们往往会选择使用不同的卷积核对图像做卷积操作,如下图所示:
【CNN】初识卷积_第13张图片
其目的是:希望不同的卷积核可以从图像中提取不同的特征。因为当提取的特征太少,是没有办法完成图像识别这个任务的。一个简单的例子:我们不能凭借眼睛这一种特征来识别猫和狗这两个类别,往往需要根据眼睛,嘴巴,外形,毛发,耳朵等等多种特征才能对猫和狗做正确的识别。

四、卷积模型实现图像识别

如下图所示是卷积模型实现图像识别的标准网络结构:从图中可以看出整个卷积网络是分为两个阶段的,分别是红色框和绿色框圈出的两部分。

在红色框中,是通过不断堆叠卷积层和池化层组成的(虽然图中只画了一层卷积和池化,实际的模型中会有多层),其中,卷积的目的是做特征提取池化的目的是做特征汇聚

在绿色框中,是通过不断堆叠全连接神经网络层组成的,其目的是对红色框传过来的特征进行学习,判断这些特征最有可能属于哪个类别。
【CNN】初识卷积_第14张图片
在上图中,卷积操作已经在之前做过详细的解释了,这个主要解释一下池化和全连接层的操作。

当池化操作与卷积操作配合使用时,池化的作用是做特征的汇聚,我们还以刚才的示例为例,如下图所示,从图像的起始位置开始做卷积操作,每次滑动的步长为2,直到末尾的位置。当第一个卷积核滑动到图中四个位置时,卷积结果分别是9,3,-1,-3 。
【CNN】初识卷积_第15张图片
这四个值在本次卷积的计算结果中大致是如下所示,注意,滑动到其他位置的卷积计算结果也应该是有值的,这里以…代替:

【CNN】初识卷积_第16张图片
我们知道,池化操作一般是跟在卷积操作后面的,即卷积的计算结果是池化操作的输入信息,在当前这个例子中,上图表即为卷积的计算结果。当我们选择使用一个2x2大小的池化核对上述卷积结果做操作时,我们发现被保留下来的数值是9 。对此是解释是:9正是卷积操作在原图中找到的对角特征,通过最大池化的方式被保留下来了;顺带把卷积认为不是很重的特征(例如3,-1,-3)删掉,这就完成了特征汇聚的过程。

到此,卷积模型中红色框部分的所有操作已经解释完了,接下来是绿色框中的全连接神经网络操作。如下图所示,我们发现,在送进全连接神经网络之前,有一步叫做Flatten的操作。对此的解释是卷积的计算结果是一组特征图,这些数据是有空间维度的(即高度和宽度),但是全连接神经网络层能接受的数据格式要求是向量(即维度等于1的数据),因此,Flatten操作的目的是把多维的特征图压缩成长度为 height × width × channel 的一维数组,然后再与全连接层连接,通过全连接层处理卷积操作提取到的特征并输出结果
【CNN】初识卷积_第17张图片
需要注意的是,上图中,全连接神经网络层最后只输出了两个节点,此时表明是一个二分类的问题,即 X 和 O 两个类别。当然模型中处理的数据全部都是数字,最后两个节点并不会直接输出字符X或O,而是0.92和0.51 。这两个数值可以看作模型认为该图像属于某类型的可能性,我们会选择最大的可能性做为当前模型对图像的识别结果。

此外,在做图像识别时,我们一般习惯在模型输出结果后增加一个简单的分类器,例如softmax分类器,其作用是把输入数据归一化到[0,1]区间,且所有归一化后的所有元素相加等于1,归一化后的数值即可表示图像属于某种类别的可能性了。例如图中[0.92, 0.51]归一化后会变成[0.98, 0.02]。

softmax的作用简单的说就计算一组数值中每个值的占比,公式一般性描述为:
设一共有n个用数值表示的分类Sk ,k∈(0,n],其n表示分类的个数。那么softmax计算公式为:
【CNN】初识卷积_第18张图片
其中,i表示k中的某个分类,gi表示该分类的值。

到此,卷积模型的标准结构已经全部介绍完了,具体模型结构如下图所示:
【CNN】初识卷积_第19张图片

五、小结

总的来说,对于图像分类任务。卷积神经网络层级结构可大致分为五个结构,分别为输入层,卷积层,激励层,池化层和全连接层。

输入层:与传统的神经网络模型一样,模型的输入需要进行预处理操作,常见的预处理操作有:去均值,归一化,图像增广,规范图像尺寸等等。

卷积层:生物角度解释其作用就是----局部感知:人的大脑在识别图片的过程中,并不是一下子识别一整张图片的,而是对图片中的每个局部特征进行有顺序的局部识别,不断提取底层信息抽象出高层特征,然后更高层次对局部进行综合操作,从而得到全局信息

激励层:本质就是激活函数,对卷积层的输出结果做一个非线性映射,让网络拥有更多的可能性。生物角度解释其作用就是细胞核对不同的输入信号做出了非线性的反应。例如用电流刺激青蛙大腿肌肉,只有电流强度达到时,肌肉才会收缩(这个过程是非线性的)。

池化层:用途是在保证原有特征信息的基础上进行特征的降维,压缩数据和减少参数。在一定程度上可以减少过拟合现象,同时提高模型的容错性。

输出层(全连接层):经过前面的卷积网络层对数据的处理,模型会学到一个高质量的特征图。其实在全连接层之前,如果神经元数目过多,学习能力过强,又可能出现过拟合现象。因此,在全连接层中一般使用Dropout操作来随机删除神经网络中部分神经元之间的链接,以此来降低全连接层的复杂度。当数据来到全连接层时,可以理解为一个简单的多分类网络(如BP神经网络),通过softmax函数得到最终预测输出,整个模型训练完成。

你可能感兴趣的:(CNN,cnn,深度学习)