注意:本文引用自专业人工智能社区Venus AI
更多AI知识请参考原站 ([www.aideeplearning.cn])
引言
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks, FNN),是深度学习的代表算法之一 。
对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被应用于计算机视觉、自然语言处理等领域。
卷积神经网络仿造生物的视觉(visual perception)机制构建,可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)。
卷积神经网络的计算
首先,要讲基于深度学习的图像识别,卷积神经网络是读者必须掌握的前置知识。在讲卷积之前,先来了解一下什么是核。
核概念与卷积操作
![图片[1]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/cb2fde63082d3da4ca12945efce83488.png)
如图1所示:g(x,y) 即为核(Kernel),每个小方格上都有一个标量代表权重 w。f(x,y) 为输入图像的像素矩阵,每个小方格上都有一个标量代表该图片在该点上的像素值。图1中卷积操作定义为核中的元素 w 与输入数据 f(x,y) 的对应元素进行相乘求和。
(1)在图1的示例中,与核中的权重 w 对应的一共有9个元素,相乘求和的结果即为卷积操作的输出。
(2)核中的权重 w 就是卷积神经网络训练需要求得的参数。
此外,通过图1可以发现,由于卷积核的尺寸一般都远远小于图像的像素矩阵尺寸,因此,只对图像进行一次卷积操作只能处理图像中的一小部分信息,这肯定是不合理的。所以,使用卷积处理图像还应存在多个滑动遍历的过程。具体来说,卷积核会从图像的起始位置(左上角)开始,以一定的顺序(从左到右,从上到下)遍历整张图像,每滑动一次就与对应的位置做一次卷积操作直到遍历到最终位置(右下角),这个过程叫做卷积对图像的一次处理。
通道
将一个图片数据集抽象为四维[数量、长、宽、色彩],每个维度都是一个通道的概念,一个通道中往往存储着相同概念的数据。例如对于一张 32×32 分辨率的彩色照片来讲,一般将其抽象为向量[1, 32, 32, 3],其中3指的是颜色特征通道,具体来说,当前的特征是RGB三种颜色。颜色通道的原理可以回忆一下小学美术课中的三原色:即世界上任何一种色彩都可以使用红色、绿色和蓝色三种颜色调配得到。因此计算机在存储彩色图像时,也借鉴了这一原理,其存储模式是三个相同大小的像素矩阵一同表征一张彩色图像,如图2所示。卷积核的维度与输入图像的维度相同,也是四维信息,其维度是[3,kernel_H, kernel_W, 3]。第一个维度的3代表卷积核的数量通道,对应图中的三个卷积核。第二维度和第三维度是高宽通道对应着卷积核的尺寸。第四维度的3代表卷积核的特征通道数量。需要注意的是,卷积核的特征通道数与输入信息的特征通道数必须是相等的,这是因为在一次卷积操作中,一个卷积核的特征通道会与一个输入信息的特征通道做卷积操作,每个通道一一对应,如图2的箭头所示。在示例中,一个卷积核的三个特征通道会分别计算得到三张特征图,但是,这三个特征图最后对应位置求和会得到一个计算结果,即不管一个卷积核的特征通道数量是多少,一个卷积核只能计算得到一张特征图,当然,如果是n个卷积核,即可计算得到n张特征图。
![图片[2]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/df766a1c6da10048b17606efa36259d4.png)
最后,回到特征通道的概念。刚刚解释过计算机要表示整张彩色图片,需要特征通道为三维来存储RGB三个颜色。实际上,在深度学习,尤其是卷积神经网络(CNN)中,特征通道的概念被扩展。一开始,网络接受的输入可能仅仅是原始的RGB图像,即3个特征通道。但是,当数据通过网络的不同层时,网络会自动提取和学习更复杂的特征。每一层可能会产生数十甚至数百个新的特征通道,每个通道代表了输入数据的不同特征。例如,在初级层,这些特征可能是边缘、角点或颜色斑块。在更深的层,这些通道可能代表更复杂的特征,如对象的部分或特定的纹理。重要的是,这些特征不是手动设计的,而是通过模型从数据中自动学习得到的。使用多个特征通道可以使网络捕捉到更多维度的信息,从而在执行任务(如图像分类、物体检测等)时更加精确。每个通道都携带着不同的信息,网络结合这些信息来做出判断。
填充
经过对卷积处理图像的方式和核概念的认识后,可以将卷积神经网络理解为一个卷积核在输入图片上遍历的过程,遍历过程中卷积核与输入信息之间对应点的乘积求和即为卷积输出。输出结果的尺寸一般是要小于输入信息的,除非卷积核的大小为1×1的,如图3所示。
![图片[3]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/207f8170f966db03be3e68e736c18339.png)
很多情况下,我们希望在不使用 1×1 大小卷积核的前提下,可以调整卷积输出结果的尺寸。此时可以在输入信息的四周填充一圈新像素(一般填充0值像素),使卷积核遍历图片后得到的卷积输出大小不变。填充的像素多少与卷积核的尺寸大小成正相关,填充过程如图4所示。当卷积核尺寸为3,步长大小为1时,需要填充一行一列像素使得输出大小与输入信息一致。
![图片[4]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/b78601dadc5f4aacfdb6ccc67a3efd3b.png)
此外,可以观察图4中1号和2号的两个像素。根据卷积的遍历规则,1号像素在整个遍历过程中只会被计算一次,而2号像素在整个遍历过程中会被计算多次。这体现了卷积算法的一个性质:更关注图片中心区域的信息。因此,如果想让卷积操作对整张图片的关注度差不多,那么可以通过填充的方式将原本在边缘的像素信息变换到靠近中心的位置。
最后,卷积计算结果的尺寸与卷积核、步长、填充和输入信息尺寸这四个因素相关。先定义几个参数:输入图片大小[W, W]、卷积核大小[F, F]、步长S、填充的像素数P。于是可以得出卷积结果的尺寸计算公式为:
即卷积核的输出尺寸为NxN
步长
此外,通过图1可以发现,由于卷积核的尺寸一般都远远小于图像的像素矩阵尺寸,因此,只对图像进行一次卷积操作只能处理图像中的一小部分信息,这肯定是不合理的。所以,使用卷积处理图像还应存在多个滑动遍历的过程,如图5gif动图所示(请点击观看)。卷积核会从图像的起始位置(左上角)开始,以一定的顺序(从左到右,从上到下)遍历整张图像,每滑动一次就与对应的位置做一次卷积操作直到遍历到最终位置(右下角),这个过程叫做卷积对图像的一次处理。其中,卷积核每次滑动的像素大小被定义为步长(stride),图5中的stride=2.
![](https://i-blog.csdnimg.cn/blog_migrate/637d736df3905d6d7df5754743853537.gif)
在图5gif的动图中,卷积核的数量为8个,每个卷积核的形状为8x3x3,其中8为卷积核特征通道的数量,这与输入数据的特征通道数量是相等的。卷积核在计算过程中的填充为1,步长为2,每个卷积核都可计算得到一张特征图,8个卷积核可计算得到8张,因此最后输出结果的通道数量也为8.
卷积的设计思想
1.平移不变性
需要注意的一点是:卷积核从图像的初始位置(左上角)滑动到最后位置(右下角)这个过程中,卷积核中的参数是不会发生改变的,这叫做参数共享,是卷积操作的重要性质之一。相反,参数独立的情况为卷积核每滑动一次,其中的参数就要重新计算。
参数共享的目的从某种角度来说是在模仿人类的一种视觉习惯:平移不变性。换句话说,就是在图像中,只要是同一种特征,那么不管这个特征被平移到图像中的什么位置,人类都能做很好的识别。实际上,卷积的设计是天然符合这个特性的:首先,卷积核在输入信息上做卷积的目的就是为了识别某一种特征(本章后续会详细解释);其次,由于滑动遍历的原因,不管要识别的特征出现在图片中的什么位置,卷积都可以通过滑动的方式,滑动到该特征的上面进行识别。但是,这有一个前提,就是该卷积核从图像的起始位置滑动到结尾位置这个过程中,寻找的都是同一种特征。这个前提可以通过参数共享的方式实现,即卷积核在对图像做一次完整的遍历过程中不发生改变,一个不变的卷积核寻找的肯定是同一种特征了。
2.局部相关性
从图像的性质来说,卷积的设计天然符合图像的局部相关性。首先关于图像的局部相关性的理解可以列举一个场景:从某人物图片中,人物的眼睛附近随机选取一个像素值a,如果单独地把a从图像的像素矩阵中拿出来,那么a仅仅只是一个数值,它代表不了任何东西,这是没有意义的;但是,如果把a再放回原本的像素矩阵中,那么它就可以跟周边的像素值一起表示眼睛这一特征,这叫作相关性。此外,考虑离a相距较远的其他像素值,由于两个像素在原图中的距离较远,它们之间的联系也是比较小的,这就体现了局部。因此,图像是一种局部相关的数据,在此性质的背景下,类似全连接神经网络这种计算全局信息的方式反而是冗余的,不符合图像性质的;而卷积处理局部的方式则显得更加合理。
实际上,对图片进行卷积操作就是把卷积核与原图片做点积操作。点积的数学解释可以解释为:两个向量之间的相似度。在当前的例子里,可以说成卷积核与原图的相似度,卷积的结果越大,说明图片中某位置和卷积核的相似度越大,反之亦然。如果把卷积核作为特征算子或者特征向量,那么卷积的过程就是通过移动卷积核在原图中的对应位置,不断去寻找原始数据中是否存在跟卷积核表征相似的特征,这在图片识别中意义重大。例如,判断一张图片是否为车子,假设卷积模型设置了4个核,它们的特征可能代表[“轱辘”,“车窗”,“方向盘”,“车门”],通过卷积核在原图上进行匹配进而综合判断图像中是否存在这四种特征,如果存在则该图片大概率是车子。
实际上,深度卷积神经网络就是去求解这些卷积核的一种网络。它们不是凭借经验随便定义的,而是通过网络不断地学习更新参数得来的。而卷积神经网络的不易解释性就在于此,随着模型的复杂,抽象出很多不同的卷积核,我们难以去解释每个核的具体含义,也难以介绍每个中间层和中间节点的含义。
3.人类的视觉习惯
最后可以从人类的视觉习惯来理解卷积的设计思想。相较于全连接神经网络,卷积神经网络的计算方法更符合人类的视觉习惯。可以想象一个场景:当突然置身于一个复杂且陌生的环境时,是怎么快速地获得周边信息的?
如果以神经网络的方式,由于神经网络的计算是全局性的,为了模仿这一性质,在观察场景时需要同时观察全局,思考全局。这其实并不是人类视觉的观察习惯。我们往往会选择先观察一个感兴趣的局部区域,观察时,只需要思考这个局部区域有什么即可。之后,再选择查看其他地方,看到哪里思考到哪里,通过有规律地扫视对全局做完整的观察。这其实与卷积神经网络先观察局部,再通过滑动的方式遍历全局,滑动到哪里就计算到哪里是一样的。所以说,卷积的设计是更符合人类的视觉习惯的。
卷积进行特征提取的过程
让我们来看一个识别字母X的图像识别示例,如图6所示。在图像的像素矩阵中,白色的像素块值为1,黑色的像素块值为负1。在图像上方的三个小矩阵分别是三个不同的卷积核。现在使用第一个卷积核去图像中进行滑动遍历:当这个卷积核滑动到图6所示的位置时(即图像左上角的方框),其卷积计算结果等于9,此时9为这个 3×3 卷积核能够计算得到的最大值。
![图片[6]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/fab68ada5512bafcc1e21d55a048bc71.png)
继续思考,当在图6所示的位置附近做卷积操作时,卷积计算结果应该是比9要小的数值,如图7所示,向右滑动一个像素位置的卷积计算结果为-1。
![图片[7]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/17d2a9062d3db6208851034a9cedd6b4.png)
现在,继续滑动卷积核,如图8所示,直到滑动到图8中所示的右下角的位置时,其卷积计算结果又等于9。思考图8所示的左上角的卷积核与图中的绿色框和黄色框两个卷积位置是否有什么联系?答案很简单,它们特征相同。
![图片[8]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/f00743c2a1b5430f88ed386726a1ff3f.png)
因此,答案就出来了:第一个卷积核就是去图像里滑动遍历,然后寻找一个是否有跟它长的一模一样的这种对角特征;如果找到了,那么卷积计算结果就是最大值;如果没有找到,那么卷积计算结果就是一个非极大值;通过极大值与非极大值的区分,就可以完成这种对角特征与其他特征的区分。卷积就是通过这种方法对输入信息进行特征提取的。简而言之,可以把卷积核看作识别某种特征的模式,卷积核的目的就是尝试去图像中提取这种特征。
需要注意的是,在一个卷积操作中,我们往往会选择使用不同的卷积核对图像做卷积操作,如图9所示。
![图片[9]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/43d51a4a07c433ae3a576e39d76d0386.png)
其目的是:希望不同的卷积核可以从图像中提取不同的特征。因为当提取的特征太少,是没有办法完成图像识别这个任务的。一个简单的例子:我们不能凭借眼睛这一种特征来识别猫和狗这两个类别,往往需要根据眼睛、嘴巴、外形、毛发、耳朵等等多种特征才能对猫和狗做正确的识别。
池化与采样
从某种程度上,池化可以看作特殊的卷积,因为池化操作包含卷积中常见的概念(核、填充、步长);区别在于,池化的核与输入信息的对应位置元素进行的操作不同,在卷积中,该操作是相乘求和;而池化中,这个操作是求平均或最大,分别对应平均池化(Average Pooling)和最大池化(Max Pooling)。池化最主要的作用就是对输入信息做降维,如图10所示。池化的核是左上角绿色方框所示部分,大小为2×2;原始输入数据的填充为0,因为在原始数据的四周并没有像素填充;池化的初始位置为左上角的2×2矩阵,滑动一次后到了右上角的2×2矩阵,滑动了两个像素位置,即池化操作的步长为2。
![图片[10]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/8c2415f3ec69284f55abc64f00991205.png)
至于左下角的2×2矩阵为平均池化的结果,例如第一个元素2的计算过程为:(1+3+1+3)/4,即池化的核与输入信息的对应位置做平均的结果;而右下角的2×2矩阵为最大池化的结果,例如第一个元素3的计算过程为:Max(1, 3, 1, 3),即池化的核与输入信息的对应位置比较取最大的结果。
最大池化的主要作用是特征提取。这种技术通过在每个窗口中保留最大值来实现,有效地识别图像中的显著特征,如边缘和纹理。同时,最大池化也起到了降维的作用,通过减少数据的空间尺寸(例如,从2×2像素块中选择最大值),帮助减少计算复杂性和防止过拟合。
继续刚才的例子,从图像的起始位置开始做卷积操作,每次滑动的步长为2,直到末尾的位置。当第一个卷积核滑动依次到图中四个位置时,卷积结果分别是9、3、-1、-3,如图11所示。
![图片[11]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/1e387a19392dde89efed38f2139d2d10.png)
这四个值在本次卷积的计算结果中大致如图12所示,注意,滑动到其他位置的卷积计算结果也应该是有输出值的,这里以“…”代替。池化操作一般接在卷积操作之后,即卷积的计算结果是池化操作的输入信息,在当前案例中,图12即为卷积的计算结果。使用一个2×2大小的池化核对上述卷积结果做操作时,我们发现被保留下来的数值是9。对此解释是:9正是卷积操作在原图中找到的对角特征,通过最大池化的方式被保留下来了;同时把卷积操作认为不是很重要的特征(例如3、-1、-3)删掉,这就完成了特征汇聚的过程。
![图片[12]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/c47396c2cb4b16a76dd2d58b30811a7b.png)
相比之下,平均池化的作用是特征融合。这种技术通过计算每个窗口的平均值来实现,有助于平滑图像的局部特征,使得模型更加关注于图像的整体结构而非局部细节。与最大池化类似,平均池化也通过降低数据的空间尺寸来减少维度,有助于降低计算负担并减少过拟合的风险。
卷积神经网络的感受野
感受野(Receptive Field)是指卷积神经网络中某一神经元在输入图像上感受到的区域大小。换句话说,感受野描述了神经元对输入图像的哪些部分产生响应。在卷积神经网络中,随着网络层数的增加,每个神经元的感受野会逐渐变大,能够感受到更广阔的输入图像区域,从而提高网络对整个图像的理解能力。
举个例子来理解,假设现在有两层卷积神经网络,它们的卷积核大小都是3×3。在网络的第一层中,每个神经元计算的输入信息范围是由卷积核定义的,即3×3=9,也就是说第一层神经元的感受野是9。但在第二层中,因为层级结构的原因,感受野会明显增加,如图13所示。
![图片[13]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/4ffe6f86b3cb6b6486bb9c670440c93a.png)
卷积神经网络感受野的作用如下:
(1)提高特征表征能力:随着网络层数的增加,每个神经元的感受野增大,能够感受到更广阔的输入图像区域,从而提高网络对整个图像的理解能力,进一步提高特征表征能力。这也是卷积神经网络为什么要设计成层级结构的原因。
(2)提高模型的鲁棒性:感受野的增大能够提高模型的鲁棒性,使得网络在面对不同尺寸、姿态、光照等情况下都能够进行有效的特征提取和图像识别。此外,通过适当地调整卷积核的大小和填充等参数,可以实现对不同尺寸的输入图像进行有效的处理。
计算感受野大小的公式是基于递归计算每一层神经元在输入图像上感受野的大小,可以使用下述公式计算:
其中, 表示第 i 层神经元在输入图像上感受野的大小,
表示第 i−1 层神经元在输入图像上感受野的大小,
表示第 i 层卷积核的大小,
表示第 i 层卷积核的步长。
在计算感受野的时候,一般从输入层开始逐层计算,假设输入图像的大小为 H×W, 则输入层中的每个神经元的感受野大小为 1 , 即 。注意, 这里的输入层可以看作模型的第 0 层, 而不是图13中的 “Layer1”。对于之后的每一层, 都可以通过上述公式计算出感受野的大小。
需要注意的是,上述公式只考虑了卷积层的计算方式,而对于池化层等其他操作,其感受野的计算方式可能会有所不同。此外,还有一些基于卷积的变体操作也可以改变感受野,例如膨胀卷积等。到此,卷积模型的标准结构已经全部介绍完了。
卷积模型实现图像识别
卷积模型实现图像识别的标准网络结构如图14所示。卷积网络被分为两个阶段,分别用两个方框圈出。
在左侧的方框内,模型的第一阶段是通过不断堆叠卷积层和池化层组成的(虽然图中只显示了一层卷积和池化,实际的模型中会有多层),其中卷积的目的是做特征提取;池化的目的是做特征汇聚。
在右侧的方框内,模型的第二阶段是通过不断堆叠全连接神经网络层组成的,其目的是对上一阶段输出的特征进行学习,判断这些特征最有可能属于哪个类别。
![图片[14]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/726afaf004439fe2a0bcbc0aa2c824c5.png)
送进全连接神经网络之前,有一步叫做展平(Flatten)的操作。对此的解释是:卷积的计算结果是一组特征图,这些数据是有空间维度的(即高度和宽度),但是全连接神经网络层能接受的数据是向量格式(即维度等于1的数据),因此,展平操作的目的是把多维的特征图压缩成长度为 “特征图高x特征图宽x特征图数量” 的一维数组,然后再与全连接层连接,通过全连接层处理卷积操作提取到的特征并输出结果。
此外,在做图像识别时,一般习惯在模型的输出结果后增加一个简单的分类器,例如Softmax分类器,其作用是把输入数据归一化到[0,1]区间,且所有归一化后的所有元素相加等于1,归一化后的数值即可表示图像属于某种类别的可能性了。
Softmax 分类器的作用简单的说就是计算一组数值中每个值的占比, 公式一般性描述为: 设一共有 n 个用数值表示的分类 , 其中 n 表示分类的个数。那么 Softmax 函数计算公式为:
其中, i 表示 k 中的某个分类, 表示该分类的值。
第一个卷积神经网络模型:LeNet
LeNet-5模型诞生于1994年,是最早的卷积神经网络之一,由Yann LeCun完成,推动了深度学习领域的发展。彼时,没有GPU帮助训练模型,甚至CPU的速度也很慢,神经网络模型处理图像时的大量参数并不能通过计算机得到很好地计算,LeNet-5模型通过巧妙的设计,利用卷积、参数共享及池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别。从此卷积成为图像处理之中的可行方式。
LeNet作为最初的卷积神经网络,其模型结构组成较为简单:两个卷积层、两个下采样、和三个全连接层,如图15所示。
![图片[15]-卷积神经网络(CNN)算法详解-VenusAI](https://i-blog.csdnimg.cn/blog_migrate/6862b989dbdc58e738fa906d51449ec8.png)
其中,卷积层和池化层负责对原始图像进行特征提取,全连接层负责对卷积池化提取到的特征进行学习,进一步根据这些特征来判断该输入图片属于哪一个类别。