卷积神经网络的构成
卷积神经网络一个卷积神经网络由若干卷积层、Pooling层、全连接层组成,常用架构模式为:
INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
卷积层(Convolutional layer)
卷积操作中使用不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。
在深层卷积神经网络中,通过卷积操作可以提取出图像中由低级到复杂的特征。
假设有一个5x5的图像,使用一个3x3的filter进行卷积,得到一个3x3的Feature Map:
具体的计算过程:
卷积计算过程
上面的计算过程可以总结为:两个小块内对应位置的像素值进行乘法运算,然后将乘法运算的结果累加起来。
通过卷积操作得到一个新的二维数组,称之为feature map。
步长(stride)和边界(padding)
像我们在上面看到的一样,过滤器或者说权值矩阵,在整个图像范围内一次移动一个像素。我们可以把它定义成一个超参数(hyperparameter),从而来表示我们想让权值矩阵在图像内如何移动。如果权值矩阵一次移动一个像素,我们称其步长为 1。下面我们看一下步长为 2 时的情况:
步长为2时的卷积当步幅设置为2的时候,Feature Map就变成2x2了,当我们增加步长值的时候,图像的规格持续变小。原来的矩阵与滤波器进行卷积后的结果中损失了部分值,而且用滤波器处理一张图片时,往往在边角处只检测了部分像素点,丢失了图片边界处的众多信息。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”作为填充值,例如:
padding这样,在进行卷积运算时,就存在两种选择:
Valid 卷积:不进行任何处理,直接卷积卷积,得到的Feature Map 将会比原图像的尺寸小。
Same 卷积:进行填充,并使得卷积后结果的大小与原图的一致。
卷积过程中,有时需要通过填充来避免信息损失,有时也要在卷积时通过设置的步长(Stride)来压缩一部分信息。
步长、填充、原始尺寸、卷积后的尺寸、滤波器尺寸之间的关系可以表示为:
其中:
,是原来的宽度和高度;
,是卷积后的宽度和高度;
是滤波器尺寸;
是填充尺寸;
是步长;
是向下取整符号,用于结果不是整数时进行向下取整。
多卷积核
需要记住的是权值的纵深维度(depth dimension)和输入图像的信道(Channel)是相同的。
权值会延伸到输入图像的整个深度。因此,和一个单一权值矩阵进行卷积会产生一个单一纵深维度的卷积化输出。
大多数情况下都不使用单一过滤器(权值矩阵),而是应用维度相同的多个过滤器。
每一个过滤器的输出被堆叠在一起,形成卷积图像的纵深维度,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。
如图:
根据公式计算,输出尺寸为3x3;
使用了两个不同的卷积核、,最终输出3x3x2;
计算的过程是将矩阵与滤波器对应的每一信道进行卷积运算,最后相加,得到的结果是一个单信道的矩阵。
另外,三层滤波器中,每一层中的值可以根据需求来设定以达到检测不同特征的目的。
CNN的特性
以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:
局部连接(sparse connection):每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野(receptive field)。
在图像卷积操作中,即神经元在空间维度(spatial dimension)是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。
参数共享(Parameter Sharing):权重共享:计算同一个深度切片的神经元时采用的滤波器是共享的,这样可以很大程度上减少参数。
共享权重在一定程度上讲是有意义的,例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的,比如输入的图片是人脸,眼睛和头发位于不同的位置,希望在不同的位置学到不同的特征 。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。
通过介绍卷积计算过程及其特性,可以看出卷积是线性操作,并具有平移不变性(shift-invariant),平移不变性即在图像每个位置执行相同的操作。卷积层的局部连接和权重共享使得需要学习的参数大大减小,这样也有利于训练较大卷积神经网络。
池化层(Pooling)
通常池化层都是用于对卷积层输出特征进行压缩,以加快运算速度,也可以对于一些特征的探测过程变得更稳健。
池化包括最大池化(Max pooling)、平均池化(Average Pooling)等。
池化在每一个纵深维度上独自完成,因此图像的纵深保持不变。
全连接层(Full connection)
与普通神经网络一样的连接方式,全连接层一般都在最后几层。
卷积神经网络主要由两部分组成:
一部分是特征提取(卷积、激活函数、池化);
另一部分是分类识别(全连接层)
卷积和池化层只会提取特征,并减少原始图像带来的参数。全连接层在整个卷积神经网络中起到“分类器”的作用。
全连接网络与卷积神经网络的对比
全连接VS卷积神经网络全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:
- 参数数量太多
考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(10001000+1)100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。 - 没有利用像素之间的位置信息
对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。 - 网络层数限制
我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:
- 局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
- 权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
- 下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
网友评论