深度学习与CNN、RNN(三)

来源:互联网 发布:淘宝代运营被骗 编辑:程序博客网 时间:2024/06/05 02:49
在了解过RNN之后,还需要了解另一种在深度学习上应用广泛的网络——CNN(卷及神经网络,Convolutional NeuralNetwork),特别是在图像识别领域,CNN由于其方便性,可靠性等特点,已经成为了图像识别领域的主要研究方法。

在图像处理中,如果与人脑对图像的处理类比,那么我们肯定更倾向于相信,人脑是通过对图像的整体分析来判定图像类别的。这也就意味着,图像信息可能是由整个或部分图片来表达,而不是一个个像素单独表达。也因此有了CNN的基本思想:和传统神经网络逐个分析像素的方法不同,CNN是每次提取图片的一部分作为一段信息,所有部分提取完之后,总体分析。

假设有一幅1000*1000像素的图片,可以表示为一个1000000的向量。在传统神经网络中,如果隐含层数目与输入层一样,即也是1000000时,那么输入层到隐含层的参数数据(同时也是网络连接的数目)为1000000×1000000=10^12,这样就太多了,基本没法训练。而CNN根据图片提取一个局部的信息,则可以很好地减少运算量。

下面以经典的CNN实现:Gradient-based learning applied to documentrecognition这篇论文中的LeNet-5网络来说明CNN的工作原理。首先放上整体的工作流程图:
深度学习与CNN、RNN(三)

首先我们有一个32*32的输入,传递给输入层。然后由输入层传递给我们的C层。这里先说明,CNN主要有两种隐藏层,一种是C层,负责卷积运算,提取特征,一种是S层,负责池化,减少运算量,防止特征过拟合。数据在C层和S层的流动过程如下:
深度学习与CNN、RNN(三)
一般来说,C层神经元集合个数,这里称为map,等于该层的卷积核个数,紧接C层的S层,map个数与C层相等,具体如何计算稍后讲解。

当输入层传递到C层时,就有一个名为卷积核的5*5矩阵,对该图片的信息进行处理,类似下图的形式(图片来源:http://www.cnblogs.com/nsnow/p/4562308.html):
深度学习与CNN、RNN(三)
如上图,本来一个5*5的输入信息,经过一个3*3的卷积核处理之后,就变成了一个3*3的feature。类似的,用5*5的卷积核,对我们32*32的输入图进行处理后,我们就得到了一个(32-5+1)*(32-5+1)=28*28的features。在LeNet-5的第一个C层(C1)中,共有6个卷积核,也就是说,我们处理后能得到6个map,这6个map可以视为我们需要的features。在C1层中,需要计算的参数为:每个卷积核有5*5+1(1表示该卷积核的偏置参数,相当于传统神经网络中的f(w*x+b)中的b),共6个卷积核,一共26*6=156个参数。然后考虑输入层和C1层之间的连接,卷积核每次提取图像特征,都相当于新建了5*5+1=26个连接,这样的提取要进行28*28次,而一共有6个这样的卷积核,因此一共建立的连接是26*28*28*6=122304个。

然后就把C1层得到的features,传递给S2层,进行池化,减小图片规模。之所以要这么减少,一个是为了减小运算量,另一个是因为,图片往往具有局部特征,比如4个相邻且由相同的卷积核提取到的feature,可能代表的是相同的图片信息,那么就可以把这4个feature压缩成一个,这样不但减少了运算量,还可以防止分类的时候出现过拟合现象。如下图,2*2的图片,可以用同一个3表示:
深度学习与CNN、RNN(三)

我们就在S2层用同样的操作,对C1层传递的数据进行处理,另外S2和C1的神经元是一一对应的,即C1的一个卷积核对应的map,只与S2中对应的map连接。我们用一个2*2的池化操作处理C1层,每邻域四个像素求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过一个sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1,因此需要训练的参数是每个神经元簇2个*6个map,共12个参数。而连接个数,每次池化操作要产生2*2+1个连接,每个map进行14*14次操作,共6个map,因此一共5*14*14*6=5880个连接。得到的S2每个map大小是14*14.

再由S2到C3,情况又有点变化。S2和C3并非全连接,即S2的6个map并非全连接到C3的16个featuremap中,而是比如第0-2个S2map连接到第0个C3map上,第1-3个S2连接到第1个C2map,具体连接如下:
深度学习与CNN、RNN(三)
之所以这么做,原因一个是减少运算量,另一个更重要的是它打破了网络的对称性,使得不同的C3map提取到的信息是不同的,这样可以有效地减少过拟合等负面影响。
C3的卷积层用的也是5*5的核,因此每个卷积核的待训练参数个数是26个。对于所有卷积核,待训练的参数个数为:有6个C3卷积核,从3个S2map提取信息,需要的参数是26*6*3个,有6个卷积核是从4个S2map提取信息,因此参数是26*6*4,有3个是从不连续的4个S2map提取,参数个数是26*3*4,最后一个是全体S2map,参数个数是26*1*6,因此一共1560个参数,而对于神经元的连接个数,每次卷积核的提取,都会建立5*5+1=26个连接,一个C3map对于一个S2map的卷积操作,都会有(14-5+1)*(14-5+1)=100次提取,而根据上面的计算,一共会有6*3+6*3+3*4+1*6=60次卷积操作,所以一共26*100*60=156000个连接。

依此类推,最后直到C5层之后的F6层,它有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。

然后再由F6层传递给输出层,这个输出层在CNN中可以是很多分类器,LeNet-5中用的是欧式径向基函数(EuclideanRadial Basis Function或Euclidean RBF)。

至此,整个CNN已经构建完毕,接下来的训练,也可以用之前提到的BP算法来逐步优化。
原创粉丝点击