当前位置:文档之家› 卷积神经网络Convolutional Neural Networks(CNN)

卷积神经网络Convolutional Neural Networks(CNN)

卷积神经网络Convolutional Neural Networks(CNN)一、什么是卷积首先回顾一下,数字图像处理中我们用卷积模板和原始图像的像素卷积。

过程如下:Step 1、先将模板旋转180度(又称折叠)Step 2、然后让模板依次和原始图像重叠,并且计算重叠部分的数值乘积之和以2D为例先对模板K做折叠,然后依次覆盖图像I,并且计算重叠部分的数值乘积之和依次进行到最后,会多出一圈,得到最后的卷积结果卷积的意义(图像处理而言);对图像使用不同的卷积模板,对图像做不同的处理。

比如平滑模板可以使图像模糊,并且可以减少噪声、锐化模板可以使图像的轮廓变得清晰。

二、卷积网络的结构2.1 从BP网络到卷积网络回想一下BP神经网络。

BP网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的。

这样设想一下,如果BP网络中层与层之间的节点连接不再是全连接,而是局部连接的。

这样,就是一种最简单的一维卷积网络。

如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络。

具体参看下图:图1:全连接的2D 网络(BP网络)图2:局部连接的2D网络(卷积网络)现在我们考虑单隐层结构,上图左:全连接网络。

如果我们有1000x1000像素的图像,有1百万个隐层神经元,每个隐层神经元都连接图像的每一个像素点,就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。

上图右:局部连接网络,每一个节点与上层节点同位置附近10x10的窗口相连接,则1百万个隐层神经元就只有100w乘以100,即10^8个参数。

其权值连接个数比原来减少了四个数量级。

因此,卷积网络降低了网络模型的复杂度,减少了权值的数量。

该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。

2.2 卷积网络的结构卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。

卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的下采样层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。

图3 经典的卷积神经网络结构图原始图像的大小决定了输入向量的尺寸,隐层由C-层(特征提取层)和S-层(下采样层)组成,每层均包含多个平面。

C1层神经元提取图像的局部特征,因此每个神经元都与前一层的局部感受野(也就是局部输入窗口)相连。

C1层中各平面(由神经元构成)提取图像中不同的局部特征,如边缘特征,上下左右方向特征等,C1层中的输入是有由上一层局部窗口的数值和连接的权值的加权和(也就是卷积,后面会具体解释为什么是卷积),然后通过一个激活函数(如sigmoid 函数,反正切函数)得到C1层的输出,接下来S2层是下采样层,简单来书,由4个点下采样为1个点,也就是4个数的加权平均。

换句话说,就是我们把2*2的像素缩小成为一个像素,某种意义上来说可以认识是图像处理中的模糊。

然后按照这个C—S的结构继续构成隐层,当然这些隐层的连接都是局部相连的。

同时有人会问了,例如S2和C3层具体要怎么连接呢,为什么会从6张变成16张特征图呢。

C3层的特征图是由S2层图像的感受野和对应权值的卷积后,通过随机的组合而形成的,也就意味着S2层和C3层并不像C1层和S2层那样是一一对应的。

但当我们感受野的大小和图像一样时,我们经过特征提取后就变成一个像素了,这里我们开始使用全连接(这样才能完整的把特征保留)。

2.3 为什么给这种局部连接命名为卷积网络卷积网络第一个特点是连接权值远远小于BP网络的权值。

卷积神经网络另外一个特性是权值共享。

这样一来就更进一步减少了对网络权值的训练(毕竟权值是共享的,也就意味着有一些全是是相同的)。

权值共享是指同一平面层的神经元权值相同。

如何理解呢!看下图2,假设红色的点和黑色的点是C1层第一个特征图的2个不同神经元,感受窗口的大小是5*5的(意味着有25个连接),这2个神经元连接的权值是共享的(相同的)。

这样一来,C1层中的每个神经元的输入值,都有由原始图像和这个相同的连接权值的加权和构成的,想想看,这个过程是不是和卷积的过程很像呢!没错,就是由这个得名的。

同时这样一来,我们需要训练的权值就更少了,因为有很多都是相同的。

还没理解的话,接着看C1层是一个卷积层(也就是上面说的特征提取层),由6个特征图Feature Map构成。

特征图中每个神经元与输入中5*5的邻域相连。

特征图的大小为28*28。

C1层有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias[偏置]参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156*(28*28)=122,304个连接。

S2层是一个下采样层,有6个14*14的特征图。

特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。

S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。

结果通过sigmoid函数计算。

每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。

S2层有12个可训练参数和5880个连接。

三、卷积网络的训练我们想想卷积网络到底有什么那些参数需要训练呢。

第一、卷积层中的卷积模板的权值。

第二、下采样层的2个参数(每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置),第三、学习特征的组合(例如S2到C3的组合方式)3.1 我们先回顾一下BP的反向传播算法3.1.1、Feedforward Pass前向传播在下面的推导中,我们采用平方误差代价函数。

我们讨论的是多类问题,共c类,共N个训练样本。

这里表示第n个样本对应的标签的第k维。

表示第n个样本对应的网络输出的第k个输出。

对于多类问题,输出一般组织为“one-of-c”的形式,也就是只有该输入对应的类的输出节点输出为正,其他类的位或者节点为0或者负数,这个取决于你输出层的激活函数。

sigmoid就是0,tanh 就是-1.因为在全部训练集上的误差只是每个训练样本的误差的总和,所以这里我们先考虑对于一个样本的BP。

对于第n个样本的误差,表示为:传统的全连接神经网络中,我们需要根据BP规则计算代价函数E关于网络每一个权值的偏导数。

我们用l来表示当前层,那么当前层的输出可以表示为:输出激活函数f(.)可以有很多种,一般是sigmoid函数或者双曲线正切函数。

sigmoid将输出压缩到[0, 1],所以最后的输出平均值一般趋于0 。

所以如果将我们的训练数据归一化为零均值和方差为1,可以在梯度下降的过程中增加收敛性。

对于归一化的数据集来说,双曲线正切函数也是不错的选择。

3.1.2、Backpropagation Pass反向传播反向传播回来的误差可以看做是每个神经元的基的灵敏度sensitivities(灵敏度的意思就是我们的基b变化多少,误差会变化多少,也就是误差对基的变化率,也就是导数了),定义如下:(第二个等号是根据求导的链式法则得到的)因为∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是说bias基的灵敏度∂E/∂b=δ和误差E对一个节点全部输入u的导数∂E/∂u是相等的。

这个导数就是让高层误差反向传播到底层的神来之笔。

反向传播就是用下面这条关系式:(下面这条式子表达的就是第l层的灵敏度,就是)公式(1)这里的“◦”表示每个元素相乘。

输出层的神经元的灵敏度是不一样的:最后,对每个神经元运用delta(即δ)规则进行权值更新。

具体来说就是,对一个给定的神经元,得到它的输入,然后用这个神经元的delta(即δ)来进行缩放。

用向量的形式表述就是,对于第l层,误差对于该层每一个权值(组合为矩阵)的导数是该层的输入(等于上一层的输出)与该层的灵敏度(该层每个神经元的δ组合成一个向量的形式)的叉乘。

然后得到的偏导数乘以一个负学习率就是该层的神经元的权值的更新了:公式(2)对于bias基的更新表达式差不多。

实际上,对于每一个权值(W)ij都有一个特定的学习率ηIj。

3.2 卷积神经网络3.2.1、Convolution Layers 卷积层我们现在关注网络中卷积层的BP更新。

在一个卷积层,上一层的特征maps被一个可学习的卷积核进行卷积,然后通过一个激活函数,就可以得到输出特征map。

每一个输出map可能是组合卷积多个输入maps的值:这里M j表示选择的输入maps的集合,那么到底选择哪些输入maps呢?有选择一对的或者三个的。

但下面我们会讨论如何去自动选择需要组合的特征maps。

每一个输出map会给一个额外的偏置b,但是对于一个特定的输出map,卷积每个输入maps的卷积核是不一样的。

也就是说,如果输出特征map j和输出特征map k都是从输入map i中卷积求和得到,那么对应的卷积核是不一样的。

Computing the Gradients梯度计算我们假定每个卷积层l都会接一个下采样层l+1 。

对于BP来说,根据上文我们知道,要想求得层l的每个神经元对应的权值的权值更新,就需要先求层l的每一个神经节点的灵敏度δ(也就是权值更新的公式(2))。

为了求这个灵敏度我们就需要先对下一层的节点(连接到当前层l的感兴趣节点的第l+1层的节点)的灵敏度求和(得到δl+1),然后乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)W。

再乘以当前层l的该神经元节点的输入u的激活函数f的导数值(也就是那个灵敏度反向传播的公式(1)的δl的求解),这样就可以得到当前层l每个神经节点对应的灵敏度δl了。

然而,因为下采样的存在,采样层的一个像素(神经元节点)对应的灵敏度δ对应于卷积层(上一层)的输出map的一块像素(采样窗口大小)。

因此,层l中的一个map的每个节点只与l+1层中相应map的一个节点连接。

为了有效计算层l的灵敏度,我们需要上采样upsample 这个下采样downsample层对应的灵敏度map(特征map中每个像素对应一个灵敏度,所以也组成一个map),这样才使得这个灵敏度map 大小与卷积层的map大小一致,然后再将层l的map的激活值的偏导数与从第l+1层的上采样得到的灵敏度map逐元素相乘(也就是公式(1))。

在下采样层map的权值都取一个相同值β,而且是一个常数。

所以我们只需要将上一个步骤得到的结果乘以一个β就可以完成第l层灵敏度δ的计算。

我们可以对卷积层中每一个特征map j重复相同的计算过程。

但很明显需要匹配相应的子采样层的map(参考公式(1)):up(.)表示一个上采样操作。

如果下采样的采样因子是n的话,它简单的将每个像素水平和垂直方向上拷贝n次。

相关主题