卷积神经网络CNN从入门到精通精编版.docx

上传人:b****3 文档编号:5688285 上传时间:2023-05-09 格式:DOCX 页数:91 大小:3.37MB
下载 相关 举报
卷积神经网络CNN从入门到精通精编版.docx_第1页
第1页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第2页
第2页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第3页
第3页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第4页
第4页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第5页
第5页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第6页
第6页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第7页
第7页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第8页
第8页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第9页
第9页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第10页
第10页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第11页
第11页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第12页
第12页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第13页
第13页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第14页
第14页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第15页
第15页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第16页
第16页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第17页
第17页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第18页
第18页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第19页
第19页 / 共91页
卷积神经网络CNN从入门到精通精编版.docx_第20页
第20页 / 共91页
亲,该文档总共91页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

卷积神经网络CNN从入门到精通精编版.docx

《卷积神经网络CNN从入门到精通精编版.docx》由会员分享,可在线阅读,更多相关《卷积神经网络CNN从入门到精通精编版.docx(91页珍藏版)》请在冰点文库上搜索。

卷积神经网络CNN从入门到精通精编版.docx

卷积神经网络CNN从入门到精通精编版

卷积神经网络CNN从入门到精通

卷积神经网络算法的一个实现

前言

  从理解卷积神经到实现它,前后花了一个月时间,现在也还有一些地方没有理解透彻,CNN还是有一定难度的,不是看哪个的博客和一两篇论文就明白了,主要还是靠自己去专研,阅读推荐列表在末尾的参考文献。

目前实现的CNN在MINIT数据集上效果还不错,但是还有一些bug,因为最近比较忙,先把之前做的总结一下,以后再继续优化。

  卷积神经网络CNN是DeepLearning的一个重要算法,在很多应用上表现出卓越的效果,[1]中对比多重算法在文档字符识别的效果,结论是CNN优于其他所有的算法。

CNN在手写体识别取得最好的效果,[2]将CNN应用在基于人脸的性别识别,效果也非常不错。

前段时间我用BP神经网络对手机拍照图片的数字进行识别,效果还算不错,接近98%,但在汉字识别上表现不佳,于是想试试卷积神经网络。

1、CNN的整体网络结构

  卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN与标准的BP最大的不同是:

CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接。

CNN的有三个重要的思想架构:

局部区域感知

权重共享

空间或时间上的采样

  局部区域感知能够发现数据的一些局部特征,比如图片上的一个角,一段弧,这些基本特征是构成动物视觉的基础[3];而BP中,所有的像素点是一堆混乱的点,相互之间的关系没有被挖掘。

  CNN中每一层的由多个map组成,每个map由多个神经单元组成,同一个map的所有神经单元共用一个卷积核(即权重),卷积核往往代表一个特征,比如某个卷积和代表一段弧,那么把这个卷积核在整个图片上滚一下,卷积值较大的区域就很有可能是一段弧。

注意卷积核其实就是权重,我们并不需要单独去计算一个卷积,而是一个固定大小的权重矩阵去图像上匹配时,这个操作与卷积类似,因此我们称为卷积神经网络,实际上,BP也可以看做一种特殊的卷积神经网络,只是这个卷积核就是某层的所有权重,即感知区域是整个图像。

权重共享策略减少了需要训练的参数,使得训练出来的模型的泛华能力更强。

  采样的目的主要是混淆特征的具体位置,因为某个特征找出来后,它的具体位置已经不重要了,我们只需要这个特征与其他的相对位置,比如一个“8”,当我们得到了上面一个"o"时,我们不需要知道它在图像的具体位置,只需要知道它下面又是一个“o”我们就可以知道是一个'8'了,因为图片中"8"在图片中偏左或者偏右都不影响我们认识它,这种混淆具体位置的策略能对变形和扭曲的图片进行识别。

  CNN的这三个特点是其对输入数据在空间(主要针对图像数据)上和时间(主要针对时间序列数据,参考TDNN)上的扭曲有很强的鲁棒性。

CNN一般采用卷积层与采样层交替设置,即一层卷积层接一层采样层,采样层后接一层卷积...这样卷积层提取出特征,再进行组合形成更抽象的特征,最后形成对图片对象的描述特征,CNN后面还可以跟全连接层,全连接层跟BP一样。

下面是一个卷积神经网络的示例:

图1(图片来源)

  卷积神经网络的基本思想是这样,但具体实现有多重版本,我参考了matlab的DeepLearning的工具箱DeepLearnToolbox,这里实现的CNN与其他最大的差别是采样层没有权重和偏置,仅仅只对卷积层进行一个采样过程,这个工具箱的测试数据集是MINIST,每张图像是28*28大小,它实现的是下面这样一个CNN:

图2

2、网络初始化

  CNN的初始化主要是初始化卷积层和输出层的卷积核(权重)和偏置,DeepLearnToolbox里面对卷积核和权重进行随机初始化,而对偏置进行全0初始化。

3、前向传输计算

  前向计算时,输入层、卷积层、采样层、输出层的计算方式不相同。

  3.1输入层:

输入层没有输入值,只有一个输出向量,这个向量的大小就是图片的大小,即一个28*28矩阵;

  3.2卷积层:

卷积层的输入要么来源于输入层,要么来源于采样层,如上图红色部分。

卷积层的每一个map都有一个大小相同的卷积核,Toolbox里面是5*5的卷积核。

下面是一个示例,为了简单起见,卷积核大小为2*2,上一层的特征map大小为4*4,用这个卷积在图片上滚一遍,得到一个一个(4-2+1)*(4-2+1)=3*3的特征map,卷积核每次移动一步,因此。

在Toolbox的实现中,卷积层的一个map与上层的所有map都关联,如上图的S2和C3,即C3共有6*12个卷积核,卷积层的每一个特征map是不同的卷积核在前一层所有map上作卷积并将对应元素累加后加一个偏置,再求sigmod得到的。

还有需要注意的是,卷积层的map个数是在网络初始化指定的,而卷积层的map的大小是由卷积核和上一层输入map的大小决定的,假设上一层的map大小是n*n、卷积核的大小是k*k,则该层的map大小是(n-k+1)*(n-k+1),比如上图的24*24的map大小24=(28-5+1)。

斯坦福的深度学习教程更加详细的介绍了卷积特征提取的计算过

程。

                                    

  图3

  3.3采样层(subsampling,Pooling):

采样层是对上一层map的一个采样处理,这里的采样方式是对上一层map的相邻小区域进行聚合统计,区域大小为scale*scale,有些实现是取小区域的最大值,而ToolBox里面的实现是采用2*2小区域的均值。

注意,卷积的计算窗口是有重叠的,而采用的计算窗口没有重叠,ToolBox里面计算采样也是用卷积(conv2(A,K,'valid'))来实现的,卷积核是2*2,每个元素都是1/4,去掉计算得到的卷积结果中有重叠的部分,

即:

                                

图4

4、反向传输调整权重

  反向传输过程是CNN最复杂的地方,虽然从宏观上来看基本思想跟BP一样,都是通过最小化残差来调整权重和偏置,但CNN的网络结构并不像BP那样单一,对不同的结构处理方式不一样,而且因为权重共享,使得计算残差变得很困难,很多论文[1][5]和文章[4]都进行了详细的讲述,但我发现还是有一些细节没有讲明白,特别是采样层的残差计算,我会在这里详细讲述。

  4.1输出层的残差

  和BP一样,CNN的输出层的残差与中间层的残差计算方式不同,输出层的残差是输出值与类标值得误差值,而中间各层的残差来源于下一层的残差的加权和。

输出层的残差计算如下:

公式来源

  这个公式不做解释,可以查看公式来源,看斯坦福的深度学习教程的解释。

  4.2下一层为采样层(subsampling)的卷积层的残差

  当一个卷积层L的下一层(L+1)为采样层,并假设我们已经计算得到了采样层的残差,现在计算该卷积层的残差。

从最上面的网络结构图我们知道,采样层(L+1)的map大小是卷积层L的1/(scale*scale),ToolBox里面,scale取2,但这两层的map个数是一样的,卷积层L的某个map中的4个单元与L+1层对应map的一个单元关联,可以对采样层的残差与一个scale*scale的全1矩阵进行克罗内克积进行扩充,使得采样层的残差的维度与上一层的输出map的维度一致,Toolbox的代码如下,其中d表示残差,a表示输出值:

net.layers{l}.d{j}=net.layers{l}.a{j}.*(1-net.layers{l}.a{j}).*expand(net.layers{l+1}.d{j},[net.layers{l+1}.scalenet.layers{l+1}.scale1])

  扩展过程:

图5

  利用卷积计算卷积层的残差:

图6

  4.3下一层为卷积层(subsampling)的采样层的残差

  当某个采样层L的下一层是卷积层(L+1),并假设我们已经计算出L+1层的残差,现在计算L层的残差。

采样层到卷积层直接的连接是有权重和偏置参数的,因此不像卷积层到采样层那样简单。

现再假设L层第j个mapMj与L+1层的M2j关联,按照BP的原理,L层的残差Dj是L+1层残差D2j的加权和,但是这里的困难在于,我们很难理清M2j的那些单元通过哪些权重与Mj的哪些单元关联,Toolbox里面还是采用卷积(稍作变形)巧妙的解决了这个问题,其代码为:

convn(net.layers{l+1}.d{j},rot180(net.layers{l+1}.k{i}{j}),'full');

rot180表示对矩阵进行180度旋转(可通过行对称交换和列对称交换完成),为什么这里要对卷积核进行旋转,答案是:

通过这个旋转,'full'模式下得卷积的正好抓住了前向传输计算上层map单元与卷积和及当期层map的关联关系,需要注意的是matlab的内置函数convn在计算卷积前,会对卷积核进行一次旋转,因此我们之前的所有卷积的计算都对卷积核进行了旋转:

a=

111

111

111

k=

123

456

789

>>convn(a,k,'full')

ans=

13653

51221169

1227453318

1124392815

71524179

   convn在计算前还会对待卷积矩阵进行0扩展,如果卷积核为k*k,待卷积矩阵为n*n,需要以n*n原矩阵为中心扩展到(n+2(k-1))*(n+2(k-1)),所有上面convn(a,k,'full')的计算过程如下:

图7

实际上convn内部是否旋转对网络训练没有影响,只要内部保持一致(即都要么旋转,要么都不旋转),所有我的卷积实现里面没有对卷积核旋转。

如果在convn计算前,先对卷积核旋转180度,然后convn内部又对其旋转180度,相当于卷积核没有变。

  为了描述清楚对卷积核旋转180与卷积层的残差的卷积所关联的权重与单元,正是前向计算所关联的权重与单元,我们选一个稍微大一点的卷积核,即假设卷积层采用用3*3的卷积核,其上一层采样层的输出map的大小是5*5,那么前向传输由采样层得到卷积层的过程如下:

图8

  这里我们采用自己实现的convn(即内部不会对卷积核旋转),并假定上面的矩阵A、B下标都从1开始,那么有:

B11=A11*K11+A12*K12+A13*K13+A21*K21+A22*K22+A23*K23+A31*K31+A32*K32+A33*K33

B12=A12*K11+A13*K12+A14*K13+A22*K21+A23*K22+A24*K23+A32*K31+A33*K32+A34*K33

B13=A13*K11+A14*K12+A15*K13+A23*K21+A24*K22+A25*K23+A33*K31+A34*K32+A35*K33

B21=A21*K11+A22*K12+A23*K13+A31*K21+A32*K22+A33*K23+A41*K31+A42*K32+A43*K33

B22=A22*K11+A23*K12+A24*K13+A32*K21+A33*K22+A34*K23+A42*K31+A43*K32+A44*K33

B23=A23*K11+A24*K12+A25*K13+A33*K21+A34*K22+A35*K23+A43*K31+A44*K32+A45*K33

B31=A31*K11+A32*K12+A33*K13+A41*K21+A42*K22+A43*K23+A51*K31+A52*K32+A53*K33

B32=A32*K11+A33*K12+A34*K13+A42*K21+A43*K22+A44*K23+A52*K31+A53*K32+A54*K33

B33=A33*K11+A34*K12+A35*K13+A43*K21+A44*K22+A45*K23+A53*K31+A54*K32+A55*K33

  我们可以得到B矩阵每个单元与哪些卷积核单元和哪些A矩阵的单元之间有关联:

A11[K11][B11]

A12[K12,K11][B12,B11]

A13[K13,K12,K11][B12,B13,B11]

A14[K13,K12][B12,B13]

A15[K13][B13]

A21[K21,K11][B21,B11]

A22[K22,K21,K12,K11][B12,B22,B21,B11]

A23[K23,K22,K21,K13,K12,K11][B23,B22,B21,B12,B13,B11]

A24[K23,K22,K13,K12][B23,B12,B13,B22]

A25[K23,K13][B23,B13]

A31[K31,K21,K11][B31,B21,B11]

A32[K32,K31,K22,K21,K12,K11][B31,B32,B22,B12,B21,B11]

A33[K33,K32,K31,K23,K22,K21,K13,K12,K11][B23,B22,B21,B31,B12,B13,B11,B33,B32]

A34[K33,K32,K23,K22,K13,K12][B23,B22,B32,B33,B12,B13]

A35[K33,K23,K13][B23,B13,B33]

A41[K31,K21][B31,B21]

A42[K32,K31,K22,K21][B32,B22,B21,B31]

A43[K33,K32,K31,K23,K22,K21][B31,B23,B22,B32,B33,B21]

A44[K33,K32,K23,K22][B23,B22,B32,B33]

A45[K33,K23][B23,B33]

A51[K31][B31]

A52[K32,K31][B31,B32]

A53[K33,K32,K31][B31,B32,B33]

A54[K33,K32][B32,B33]

A55[K33][B33]

  然后再用matlab的convn(内部会对卷积核进行180度旋转)进行一次convn(B,K,'full'),结合图7,看红色部分,除去0,A11=B'33*K'33=B11*K11,发现A11正好与K11、B11关联对不对;我们再看一个A24=B'34*K'21+B'35*K'22+B'44*K'31+B'45*K'32=B12*K23+B13*K22+B22*K13+B23*K12,发现参与A24计算的卷积核单元与B矩阵单元,正好是前向计算时关联的单元,所以我们可以通过旋转卷积核后进行卷积而得到采样层的残差。

  残差计算出来后,剩下的就是用更新权重和偏置,这和BP是一样的,因此不再细究,有问题欢迎交流。

5、代码实现

  详细的代码不再这里贴了,我依旧放在了github,欢迎参考和指正。

我又是在重造车轮了,没有使用任何第三方的库类,这里贴一下调用代码:

publicstaticvoidrunCnn(){

//创建一个卷积神经网络

LayerBuilderbuilder=newLayerBuilder();

builder.addLayer(Layer.buildInputLayer(newSize(28,28)));

builder.addLayer(Layer.buildConvLayer(6,newSize(5,5)));

builder.addLayer(Layer.buildSampLayer(newSize(2,2)));

builder.addLayer(Layer.buildConvLayer(12,newSize(5,5)));

builder.addLayer(Layer.buildSampLayer(newSize(2,2)));

builder.addLayer(Layer.buildOutputLayer(10));

CNNcnn=newCNN(builder,50);

//导入数据集

StringfileName="dataset/train.format";

Datasetdataset=Dataset.load(fileName,",",784);

cnn.train(dataset,3);//

StringmodelName="model/n";

cnn.saveModel(modelName);

dataset.clear();

dataset=null;

//预测

//CNNcnn=CNN.loadModel(modelName);

Datasettestset=Dataset.load("dataset/test.format",",",-1);

cnn.predict(testset,"dataset/test.predict");

}

6、参考文献

[1].YANNLECUN. Gradient-BasedLearningApplied toDocumentRecognition.

[2].ShanSungLIEW. Genderclassification:

Aconvolutionalneuralnetworkapproach.

[3]D.H.HubelandT.N.Wiesel,“Receptivefields,binocularinteraction teraction,andfunctionalarchitectureinthecat’svisualcortex,”

[4] tornadomeet. 

[5]JakeBouvrie. NotesonConvolutionalNeuralNetworks.

[6]C++实现的详细介绍.

[7]matlabDeepLearnToolbox 

 

 转载自:

 

卷积神经网络

卷积神经网络(Convolutional Neural Networks:

CNN)是人工神经网络(ANN)的一种,是深度学习的一种学习算法。

它在图像识别和分类、自然语言处理广告系统中都有应用。

有意思是,卷积神经网络的提出其实就是来自于生物视觉模型。

1981年的诺贝尔医学奖,颁发给了DavidHubel、TorstenWiesel。

他们的工作给人们呈现了视觉系统是如何将来自外界的视觉信号传递到视皮层,并通过一系列处理过程(包括边界检测、运动检测、立体深度检测和颜色检测),最后在大脑中构建出一幅视觉图像。

这个发现激发了人们对于神经系统的进一步思考,神经-中枢-大脑的工作过程,或许是一个不断迭代、不断抽象的过程。

如下图所示,从原始信号摄入开始(瞳孔摄入像素Pixels),首先进行初步处理(大脑皮层某些细胞发现边缘和方向),抽象(大脑判定眼前的物体的形状是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。

六十年代的生理学的发现,促成了计算机人工智能在四十年后的突破性发展。

1989年,YannLeCun (纽约大学教授,现FacebookAI研究室主任)提出了卷积神经网络,这是第一个真正成功训练多层网络结构的学习算法,但在当时的计算能力下效果欠佳。

直到2006年,GeoffreyHinton提出基于深信度网(Deep Belief Net)和限制波尔兹曼机(RestrictedBoltzmann Machine)的学习算法,重新点燃了人工智能领域对于神经网络的热情。

卷积神经网络现在计算机视觉领域表现出众。

ImageNetClassificationwithDeepConvolutionalNeuralNetworks,这篇发表于NIPS2012的文章,是Hinton与其学生为了回应别人对于DeepLearning的质疑而将CNN结合GPU并行技术用于ImagenetChallenge(图像识别目前最大的数据库,被誉为计算机视觉圣杯),最终取得了非常惊人的结果。

他们的算法在2012年取得世界最好结果,使分类错误率从26.2%下降到16%。

2013年MatthewZeiler的算法继续将错误率下降到11.2%。

MatthewZeiler还创立了Clarifai,让我们可以有机会使用他们的图像识别算法对图片标注分类或图像搜索。

TheconvnetfromKrizhevskyetal.'sNIPS2012ImageNetclassificationpaper.

在月初Kaggle结束的GalaxyZoochallenge中,参赛者要对星系图像进行分类(Spiral/Elliptical,Merging/Notmerging,Clockwise/Anti-clockwise),获胜的算法也是使用了卷积神经网络。

SanderDieleman已放出了代码和详尽的文档:

 MysolutionfortheGalaxyZoochallenge

2014年3月,Facebook刚刚公布了他们在CVPR2014的文章:

DeepFace:

ClosingtheGaptoHuman-LevelPerformanceinFaceVerification。

他们用四百万人脸图片训练了一个九层的卷积神经网络来获得脸部特征,神经网络处理的参数高达1.2亿。

他们在著名的公共测试数据集LFW(labeledfaceinthewild,1:

1地判断是否两个照片是一个人)上达到了97.25%的正确率。

这个数字已经基本接近人眼的辨识水平。

北京Face++团队的算法达到97.27%的正确率,在美图秀秀中就有应用,他们的主页提供了API

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2