详解卷积神经网络CNN
Posted Python爬虫和数据挖掘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解卷积神经网络CNN相关的知识,希望对你有一定的参考价值。
文章目录
文章目录
1. 为什么需要卷积神经网络
2. 卷积层
3. 池化层
4. 全连接层
5. 总结
1. 为什么需要卷积神经网络
我们前面已经讲过全连接神经网络的基本结构,以及其强大的数据表达能力,我们能够通过合理的设计网络结构,帮助我们实现复杂的工作。
图像分类是图像处理中十分常见的任务,我们的大脑从出生就开始训练这件事情,通过观察周围环境或者图片,很容易识别出场景中的各种对象,如下图
我们很快就判断出这张图片里有狗,气球,帘布等,如果任务是做猫狗分类,此时我们很确定的说,这是一张狗的图片。
这样的图片在计算机看来是由像素矩阵构成的,我们希望全连接神经网络也能够帮助我们完成图像分类工作,但实际面临的问题是,以一张 像素的彩色图片来说,每个像素都有 三个参数来表示颜色信息,因此该神经网络的输入层有 个参数,我们假设网络的第一层有 个神经元,则需要训练的参数有 个 ,也就是说,仅第一层神经网络就需要训练30亿个参数!!!这会导致我们需要大量的训练数据,且很容易造成过拟合,且处理这些数据需要大量的内存,我们几乎很难完成这样的网络学习。 另外,全连接神经网络需要将像素矩阵拉平,无法保留图片的空间信息。
事实上,我们能够识别出来图像中的狗狗,并不是因为看到了气球或者图片里的其他东西,而是因为我们通过以往的认知,归纳出了狗狗的身体特征,如毛发,脸,嘴巴和爪子等,通过对比这些特征,我们很确信的认为在图里看到了一只狗狗。因此我们考虑希望「神经元也可以提取狗狗的一些关键特征」,神经网络只需要观察该图片中是否具有这些特征来判断该图是否为狗狗的图片。
另外,在提取特征的时候,我们不需要观察整张图片,比如某个神经元用来检测图片中是否有狗狗的鼻子,它只需要包含狗鼻子的一小块像素数据就可以了,我们并不需要将这个神经元与图片所有的像素点相关联,且我们希望该神经元能够检测出现在图片不同位置的该特征。
最后,在不丢失图片关键特征的前提下,缩小图片并不会影响我们对图片的判断,这样又可以减少图片参数。
基于以上分析,我们希望神经网络能够
-
提取关键特征 -
保留关键特征的前提下,减少图片维度 -
基于特征,正确识别图片类型
卷积神经网络 很好的帮助我们解决了这些问题,它包含卷积层、池化层和全连接层,其中卷积层负责特征提取,池化层负责数据降维,全连接层则根据最终提取的特征数据进行任务分类,输出预测结果。接下来我们将详细介绍每一层是如何工作的。
2. 卷积层
2.1 卷积计算过程
卷积层用来做卷积计算,用于提取图像特征,经过卷积得到的图均叫做特征图。我们假设输入的图片是 的单通道图片,分别对应图片的宽度,高度和通道数,我们使用一个 的卷积核对该图片进行卷积,将得到一个 的特征图,如下图所示:
卷积计算方式为,从输入图像的左上角开始,将卷积核覆盖在输入图中,对应位置的数据相乘后在进行相加(每个卷积核需要有一个 ,为了方便描述卷积计算过程,这里我将忽略 ),就得到了特征图的第一个像素值,如下图所示
先将对应位置的元素相乘 有
再将矩阵的所有值相加即可得到特征图的左上角值 :
然后将卷积核从输入图中向右移动一步,在进行相乘和相加操作,得到特征图的第二个值: , 依次进行该操作,就可以得出特征图的所有值了,下面的动图很清晰的描述了卷积计算过程。
需要注意的是,卷积计算后得到的数值需要通过激活函数激活,才是特征图的真实数值,关于常用的激活函数类型以及优缺点,在BP算法详细推导及分析一文中已有相关介绍,这里不再赘述,这里我们选用 激活函数。由于该步相对卷积计算来说过于简单,不再单独强调卷积之后的激活计算。
2.2 多维卷积
我们现在已经知道了如何对二维的灰度图像进行卷积,现在我们看下如何对具有 三通道的彩色图像进行卷积。如下图,对一个 的图像进行卷积,为了保证每个通道都能被正确计算,我们必须使用与输入图像通道数一致的卷积核,这里我们使用了一个 的卷积核,将得到了一个 的特征图
计算方式为卷积核只在宽度和高度方向上移动,卷积核覆盖到的地方对应数据相乘,将乘积之后的所有数据相加即可,当然这个卷积核也可以有一个 ,需要将卷积计算的和加上 就是特征图的结果值了,这跟二维的卷积操作是一致的。
注意,使用一个卷积核得到的是 的特征图!
同时,可以设定多个卷积核,多个卷积核的结果沿通道方向排列,如下图所示
通过以上分析,可以了解到卷积操作需要遵循以下规则
-
卷积核的通道数必须与被卷积图的通道数一致 -
卷积得到的特征图的通道数跟所采用的的卷积核个数保持一致
2.3 特征图大小计算
我们尝试归纳出特征图大小的计算方式,我们先进行以下规定
-
输入的图像为 -
卷积核大小为 -
卷积核每次移动的步数 是可以指定的,设为 ,表示在宽度和高度的移动步数 -
输出特征图的大小为 -
特征图的通道数只跟卷积核的个数有关:特征图的通道数=卷积核个数。与特征图的宽和高无关,因此这里讨论特征图大小时,暂不考虑通道数
则有以下关系式成立
证明如下:
❝设卷积核在原图上的一个 方向能够移动总次数为 ,每移动一次会产生一个卷积输出,由于卷积核首次覆盖输入图 方向的时候也会产生卷积输出,因此应有 。
移动 次之后,移动步长占用的长度为 , 卷积核占用的长度为 ,则应有 成立。
此时有 则
因此 同理 有
❞
对于上面的例子,输入图像为 , 卷积核为 ,移动步长 , 根据公式可知,输出的特征图大小为
2.4 Padding
我们以步长为 作为研究对象,则此时卷积之后的特征图大小为 ,会发现每做一次卷积,得到的特征图都会减少,之前我们用 的卷积核卷积 的输入图得到了 的特征图, 如果使用一个 的卷积核对这个特征图继续做卷积操作,则得到一个 的卷积图,这可能不是我们想要的。
另外,我们通过观察图 的卷积过程会发现,位于边缘的像素被卷积计算的次数相对较少,这会让我们丢失一些图像边缘位置的信息。
往往我们通过在图片四周补零的方式来处理,这种处理方式叫做 ,用 表示补零数,如下图,我们对输入图的四周各补 个零,即 , 则相当于输入图大小变成了 ,利用公式可计算出特征图大小为
当然,对于这个例子也可以多补几个零, 至于要补多少,我们往往有两种选择: 和 。
表示不填充零,即
表示卷积之后的特征图大小跟输入图大小相同,即 , 可以得到 。因此,我们往往要求使用的卷积核的大小 均为奇数,这样可以保证四周可以填充相同数量的零。需要注意的是卷积之后的特征图大小跟输入图大小相同,仅在 时才成立,也可以理解为, 当步长大于 时,补零数仍为 ,则此时有
❝上面的例子,输入图像 , 卷积核为 ,步长为 ,则 (表示宽和高方向两边各补 个 ),此时特征图为 ,如果步长为 ,则特征图为
❞
因此,引入 操作之后,特征图的大小最终可表示为
2.5 感受野
感受野 是指卷积神经网络各输出特征图中的每个像素点(也可以叫做神经元,稍后会介绍原因),在原始输入图片上映射区域的大小。假设输入图像大小为 ,卷积步长为 ,使用两层 的卷积核,经过两次卷积,得到 的特征图
第一次卷积得到一个 的特征图,特征图左上角的像素点对应原图中的橙色区域,因此这个像素点的感受野为 。 该特征图再经过一个 卷积核卷积之后,得到 的特征图,观察该图可知这个像素点对应的感受野为 。
当然,我们也可以直接选择一个 的卷积核对原图进行卷积,得到一个 的特征图,对应的这个像素点的感受野也是 。
两种卷积方式都能得到感受野是 的像素点,区别在于,使用2个 的卷积核,参数总数为 个,使用一个 的卷积核需要 个。 因此我们可以尽量选择多个小的卷积核来替代一个较大的卷积核。
2.6 权值共享与参数学习
为了方便描述以及绘图,我们以输入图为 ,卷积核为 ,步长为 的卷积运算为例,将得到一个 的特征图。
根据卷积的计算过程,我们可以用神经网络的表述方式来理解卷积操作,将输入图的矩阵拉直,成为神经网络的输入,卷积核则相当于一个权重矩阵(矩阵的各个参数值是需要学习得到的),特征图的每个元素值相当于神经元的输出,如下图右侧所示,左侧则是一个全连接的神经网络。
通过对比两个图不难发现,卷积神经网络相比全连接神经网络,少了很多连接关系,相比于全连接,这种连接方式叫做局部连接,当然这并不是本质的差异,因为我们可以将这些缺少的连接线的权重值设为 , 这个差异就不存在了。
比较本质的差异是权值共享,全连接神经网络的每个连接线都需要设置权重并利用后向传播分别进行权值更新,而卷积神经网络的部分权重值是共享的。针对上图,全连接神经网络需要学习 个权重值,而卷积神经网络只需要学习 个参数。
❝通过卷积神经网络图也能发现,输入图的边缘数据被使用的次数较少,如 等只被使用了一次,最中间的元素 则被使用了4次
❞
权值共享是卷积核作为特征提取器的必然结果,可以将卷积核看做一个如下图所示的神经元,该神经元用于检测图片的某一个特征, 该神经元以卷积核大小的空间扫描图形,从而观察所扫描区域是否具有该特征或者具有该特征的程度。扫描图像的过程,就是不断调整该神经元输入得到不同特征图输出值的过程。
特征图的参数是需要学习得到的,仍使用后向传播算法进行,关于后向传播之前已经详细介绍过,这里不再单独介绍。卷积神经网络引入了局部连接和权值共享的机制,在后向传播时稍有不同,为了便于理解局部连接机制对后向传播的影响,我们用权值为 的连接线(图中灰色连接线)将卷积层扩展为全连接网络,如下图所示,这样我们就可以按照全连接神经网络的后向传播算法进行求解。
这样理解的另外一个好处是,我们可以得到一个权重的稀疏矩阵
输入
则输出
这也跟全连接网络是保持一致的,且这样的全连接网络具有了稀疏性。从这个角度理解卷积网络显得特别容易,甚至比全连接网络还要简单,只是有一些区别于全连接网络的数据处理罢了。
关于权值共享对后向传播的影响,只需要保证这些要共享的参数初始化和更新保持一致即可。以上图中紫色线条为例,图中共有四条紫色的线,对应的权重分别为 ( 表示第 个输入与第 个输出之间的连接权重)反向传播时,误差对四个权重的偏导数分别为
由于四个权重值要求共享,因此我们只需要保证 的初始值相同,在进行梯度更新时,保证共享的参数同步更新即可,如可以选择以 进行更新。
3. 池化层
池化层是一种降采样操作,可以降低特征图维度,从而减少参数和计算量,同时保留了图像的关键特征。也能减少特征对空间的依赖,提高所提取特征的鲁棒性。常用的池化操作有最大池化( )和平均池化( ) 。
3.1 最大池化
我们以最大池化为例,简单讲解下如何进行池化计算,其实理解了卷积的计算之后,池化计算也就很容易就理解了。首先我们需要指定池化的大小以及池化步长,这是一组超参数,我们不需要通过学习得到,直接指定即可。一般选择池化大小为 ,步长为 。以输入为 的特征图为例,从特征图左上角开始,从 区域内选取最大值,作为下一层特征图的一个输出,然后水平向右移动 个格子,再次求解 区域内的最大值,依次计算,得到完整的新特征图。如下图所示
经过池化之后,得到一个 的特征图。最大池化保留了池化区域内最显著的特征,去除了其他的杂讯。
3.2 平均池化
平均池化则是取 区域内所有像素点的平均值,如下图所示
得到一个 的特征图。平均池化保留了更多的信息,但得到的特征会相对模糊。
另外,需要注意的是,需要对特征图的所有通道都进行同样的池化操作,池化后的特征图通道数保持不变,宽和高可以用卷积的特征结果图计算方式进行计算。
3.3 池化层的后向传播
由于池化层没有需要学习的参数,在进行后向传播的时候直接将梯度按规则传递到前一层即可,为了方便描述,我们用下图描述池化的正向计算过程
以最大池化为例,有
在进行误差后向传播时,有
依次计算各个 ,得到对应的下图结果
我们发现,对于最大池化,在进行误差反向传播时,误差项会原封不动的传递到上一层对应池化区域内的最大值对应的像素点(神经元),其他的神经元的误差项均为 。
如果是平均池化,则有
在进行误差后向传播时,有
依次计算各个 ,得到对应的下图结果
我们发现,对于平均池化,在进行误差反向传播时,误差项的值会平均分配到上一层对应池化区域内的所有神经元。
4. 全连接层
将通过卷积层和池化层之后得到的特征图的各个特征值拉直,形成一个列向量,作为全连接神经网络的输入,利用全连接网络完成图像分类。关于全连接神经网络,前面的神经网络基础篇已经介绍了很多,这里不再介绍。
5. 总结
通过前面的介绍,我们可以用下图来表示一般的卷积神经网络结构
可根据实际的需求来设计具体的卷积神经网络,接下来我们将介绍几个常见的卷积神经网络架构: 等,加深对神经网络结构的理解。
以上是关于详解卷积神经网络CNN的主要内容,如果未能解决你的问题,请参考以下文章