【《基于卷积神经网络的图像识别研究》8200字】_第1页
【《基于卷积神经网络的图像识别研究》8200字】_第2页
【《基于卷积神经网络的图像识别研究》8200字】_第3页
【《基于卷积神经网络的图像识别研究》8200字】_第4页
【《基于卷积神经网络的图像识别研究》8200字】_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于卷积神经网络的图像识别研究摘要:卷积神经网络自从2012年的ImageNet图像识别比赛之后,彻底颠覆了图像识别领域,它具有权值参数少以及适应性强的优点,广泛使用于图像识别领域。本文从卷积神经网络的历史出发,详细介绍卷积神经网络基本网络结构和相关算法。在此基础上,以卷积神经网络在手写数字识别方面的实际应用为例,分析模型结构与参数对准确率的影响,为实现性能更优的卷积神经网络奠定基础。关键词:图像识别;训练算法;网络结构目录TOC\o"1-4"\h\u197111引言 1196091.1卷积神经网络简介 114551.2卷积神经网络的发展史 1164302卷积神经网络介绍 2304902.1输入层 261542.2卷积层 3146722.3激活层 524792.4池化层 7314092.5全连接层 7177213手写数字识别 102933.1手写数字识别介绍 10241393.2模型与参数分析 10107004.总结 157518参考文献 16PAGEPAGE21引言1.1卷积神经网络简介图像识别已经走入了千家万户,很多地方我们都能用得到图像识别,例如手机软件加入人脸识别辅助验证。而卷积神经网络(Convolutionalneuralnetwork),简称CNN,不仅优化网络结构,使网络的模型变得更为简单,同时也采用权值共享,大大减少了网络中参数的数量,让训练模型的计算量有了显著的降低,使其在图像识别方面大放异彩。在面对多通道图片的时候,这些优点更为明显,而且不同于过去算法的复杂输入过程,CNN的网络结构一旦建立好,就可以直接将图片输入其中。卷积神经网络从萌芽,然后一步步发展到今天,经历了许多过程,其准确率也在不断的上升。如今,卷积神经网络在图像识别上的能力早已超越了人类的正常水平。1.2卷积神经网络的发展史CNN的发展,最早可以追溯到1962年,Hubel等人通过对猫的视觉皮层细胞的研究,首次提出了感受野的概念,这个概念到了今天也依旧是卷积神经网络的一部分。到了1980年,日本科学家福岛邦彦提出了一个包含卷积层,池化层的神经网络结构,这也是神经感知机的原型。1998年,YannLecuu提出了LeNet-5,将BP算法运用到上述神经网络的训练上,这就是当代卷积神经网络的初始阶段,这个时期的卷积神经网络,不仅效果不太好而且训练也极为困难,因此关注的人并不算多,处于学术界的边缘地位[1]。直到2012年,在ImageNet图像识别比赛中,Hinton组提出的在Alexnet引入了全新的深沉结构和dropout模型,瞬间让图像识别错误了率从以前最高25%降低到15%,彻底颠覆了图像识别领域。在之后,Lecun组于2013年提出一个Dropconnect,再次降低错误率到11%。在后来,新加坡国立大学的颜水成提出了NetworkinNetwork,改变了原本的网络结构,加入了一个1*1的卷积层,NetworkinNetwork的使用也获得了2014年Image挑战中图像检测的冠军。NetworkinNetwork的思想是,卷积神经网络结构不需要固定,可以大胆去想,大胆去试,所以,在2014年,Inception和VGG把网络层数加到了20层,图像识别的错误率再次大大降低,到了6.7%,而人类的错误率在5.1%,这说明CNN在图像识别方面的能力已经很接近人类了。在之后,越来越多的人对CNN进行改进,CNN在图像识别方面的其准确率进一步提高,已经超过了人类平均水平。现在,图像识别在各处得到广泛应用,给我们的生活带来越来越多的方便!

2卷积神经网络介绍卷积神经网络使用卷积操作获取特征,池化操作降低数据量,权共享减少网络中的权值参数的数量,在图像识别方面大方异彩。卷积神经网络主要有输入层,卷积层,激活层,池化层,全连接层,这五个层次是一个卷积神经网络所不能缺少的必要部分[2]。2.1输入层不管是机器学习,还是传统的神经网络,对于原始的输入数据,一般都需要进行一定的预处理,输入数据经过预处理,往往能有更好的效果,常见的输入层的图像预处理方法有两种:去均值化,归一化。去均值化指把原始输入数据每个方向上的数据都中心化为0,具体的做法是,所有输入数据求和再除以输入数据的个数,然后每个输入数据再减去此数,这个过程就是去均值,公式如下,其中Xi表示第i个输入数据,Yi表示经过去均值化后的第i个输入数据:(2.1式)(2.2式)归一化是指将所有的原始输入数据统一到一个相同的范围,这可以降低数据的噪声影响,降低远远偏离中心的异常数据的影响,使输入数据更加有效。归一化的方法有很多,这里仅仅介绍几种比较常见的,比如(0,1)标准化,Z-score标准化,sigmoid标准化[3]。(0,1)标准化是指遍历原始输入数据中每一个数据,找到其中的最大的数据MAX和最小的数据MIN,并把他们记录下来,然后以MAX-MIN为基准,对所有数据进行归一化操作,公式如下,其中Xi表示第i个输入数据,Yi表示对第i个输入数据进行(0,1)标准化处理后的结果:(2.3式)Z-score标准化指先通过得到原始输入数据的标准差u和标准差σ,然后使归一化数据的数据符合标准正态分布。公式如下,其中Xi表示第i个输入数据,Yi表示对第i个输入数据进行Z-score标准化处理后的结果:(2.4式)Sigmoid函数图像是一个S形曲线的函数,在点(0,0.5)处图像对称,使用一般的Sigmoid可以将所有的输入数据归于(0,1)之间,但是,如果你对公式进行平移,中心点也会发生变化,可以由此改变归一化区间。一般Sigmoid函数公式如下,其中xi表示第i个输入数据,Yi表示对第i个输入数据进行Sigmoid函数标准化处理后的结果:(2.5式)2.2卷积层讲解卷积层之前,先介绍下局部感受野和权值共享的概念,这两个概念不仅在卷积层,也在后面的池化层和全连接层有使用,并且卷积神经网络之所以能在图像识别大放异彩,也是由于采用了局部感受野和权值共享,不仅让卷积神经网络中的权值参数大大减少,也降低了过拟合的风险[4]。局部感受野,最开始是由Hubel等人提出。其定义为,CNN通过卷积操作输出的特征图上的一个像素点在输入图片上对应的映射的区域大小。通俗点来理解,把输入图片当作一个人,特征图当作感受器,我们的身上有许许多多的感受器,每个感受器都会反应身体的部分情况,当身体情况发生变化,对应感受器就会产生相应的变化。因为每个感受器在人体上都有一定的映射,记录身体部分的变化,所以感受器的变化在很大程度上就可以反应出人体的变化,这就是局部感受野。感受野的大小计算是一个递推的过程,简要对递推过程进行阐述,首先,第一层感受野的永远等于第一个卷积核的大小,所以RF1=k1(第一个卷积核的大小为k1*k1),递推得RF1=k1RF2=k1+(k2-1)*stride2RF3=k1+(k2-1)*stride+(k3-1)*stride3RF4=k1+(k2-1)*stride+(k3-1)*stride+(k4-1)*stride4其中ki表示第i层卷积核的大小,stridei表示第i层卷积核的移动步伐,最终感受野大小的递推公式为:(2.6式)权值共享指的是,对于每一张输入的图片,都使用filter(滤波器)去扫描,filter里面的参数就称为权值,例如卷积核里面的参数,池化函数里面的参数。而对于每张输入图片,我们若想获取一个特征,仅仅采用一个filter去对整张图片进行卷积,而不是对于图片的不同位置都采用不同的filter,这就是权值共享。权值共享可以有效降低网络中参数的个数,从而大大减少模型的训练时间,例如,我们输入了一张大小为n*n的图片,卷积核的大小为k*k,步长为1,如果不采用权值共享,那么我们需要设置(n-k+1)*(n-k+1)*k*k个参数,而采用权值共享,我们总共只用设置k*k个参数就行了。所以说,输入的图片越大,权值共享的效果就越明显,这可能使网络中的参数减少数百倍数千倍,甚至万倍以上不止!而不采用权值共享,过多的参数可能会使计算量过于庞大,导致训练时间过长,甚至是因此死机。卷积层的作用的是通过卷积运算,从而让我们可以提取图片的特征,也可以使原图片的一些特征得到加强,并且降低噪声。卷积神经网络中的卷积运算只需要将对应卷积区域的数据全部加起来就行了,方式是用一个滤波器与输入图片进行卷积,由于卷积神经网络采用了权值共享,所以每提取图片的一个特征,我们仅仅需要再加一个滤波器就可以了,滤波器与图片卷积后,加上偏置Bi,就可以得到卷积层Ci,过程如下:我们先假设我们仅仅只提取一个特征,所以只需要一个滤波器F,一个偏置B,假设滤波器的大小为 k*k,步长设置为stride,一般来说,步长设置为奇数,因为设置为偶数且不使用零填充的情况下,输出结果有可能不是整数,而这显然是有问题的。在图像检测中,不管你输入的图片是单通道,还是三通道,都可以用单通道图片来表示,例如,三通道就是三张单通道图片。因此,不管输入的图片是什么,滤波器都可以是k*k的。假设输入图片m*m*n(n表示图片的通道数)的,显然m>=k,把输入图片分为n个m*m的矩阵,若考虑零填充的情况,则在这n个m*m的矩阵周围加上一圈0,使矩阵大小变为(m+1)*(m+1),这里假设不采用零填充,但是即使使用零填充,后续方式也一样。从矩阵左上角开始,得到一个大小为k*k的矩阵C11,若向右平移stride个位置,得到C12,再次向右平移stride个位置,依次可以得到,C13,C14若向下平移stride个位置,可得到C21,再次向下平移stride个位置,依次可得到C21,C31同时,按先向右移动到边界,然后在回到最左边,再下移动,再向右移动,依次进行,则可以得到一个矩阵C,C的表示如下:(2.7式)C中每一个元素大小都是k*k,滤波器与C中每一个元素对应相乘再相加,得到的结果加上偏置B再根据下标放入输出矩阵,如下图:图2.1卷积示意图2.3激活层激活层极为重要,因为我们处理的问题往往不是线性的,所以我们必须加入非线性因素才能用于解决非线性问题[5]。显然,如果激活函数是线性的,那么线性与线性的组合,无论怎样,我们最后得到的也只能是线性,只能解决线性问题。所以激活函数必须是非线性,这样才能用于解决非线性问题。同时,由于我们需要进行参数学习,要对激活函数进行求导操作,所以激活函数最好是连续可导的。不同的激活函数有不同的效果,适合的场合也不尽相同,现在介绍几种卷积神经网络常用的激活函数:Relu,Elu,PRelu,Maxout。Relu函数公式和函数曲线如下:(2.8式)图2.2Relu函数图像Relu函数有2个优点,一是如果输入为正数,那么不存在梯度饱和问题,二是导数计算方便,无论是前向传播还是后向传播速度都很快,所以卷积神经网络最开始经常使用Relu函数来训练数据,之后再使用其他激活函数。但是Relu函数也有它的缺点,例如当输入为负数的,Relu函数的值恒等于0,前面我们提到过,对于参数的学习,需要使用到激活函数的导数,如果Relu的值恒为0,那么导数也恒为0,参数无法更新,导致失去学习能力,这种情况,比梯度饱和更严重,因此在使用Relu函数的时候出现模型失去学习的情况时,要注意是否激活函数恒等于0的情况。Elu函数公式和函数曲线如下:(2.9式)图2.3Elu函数图像Elu公式可以看作对Relu公式的一种改进,可以看到,当输入为负数的时候,导数不为0,所以当输入为负数的时候也有一定的意义,可以克服Relu函数输入为负数的时候,梯度为0的情况,失去学习能力的情况,但是由图像也可以看出,在输入为负数的时候,梯度变化很小,很可能进入梯度饱和状态。PRelu也是对Relu的另一种改进,PRelu函数公式和函数图像如下:(2.10式)图2.4PRelu函数图像一般来说,虽然a的取值在0~1之间,但是实际上a的取值一般很小,大概零点零几,特别的当a=0.01时,称此时的PRelu函数为Leaky-Relu,可以把Leaky-Relu看作PRelu的一种特殊情况。从PRelu函数公式或者图像都可以看出,当输入为负数的时候,斜率虽然小,但不会是0,也不会进入梯度饱和状态。Maxout函数公式如下:(2.11式)Maxout函数包含Relu函数的优点,但是没有Relu函数的缺点,比如计算同样简单,而且没有梯度饱和的危险。然而,由于引入了2个参数,所以参数的数量变为Relu时候的2倍,这使得Maxout的计算效率相对较低。但是,Maxout具有有超强的拟合能力,可以拟合任意的凸函数,当然,前提是隐含节点数目足够。其他的激活函数还有一些,比如Tanh或者Sigmoid。但是在卷积神经网络中,Tanh和Sigmoid的效果往往不好,效果比不上Relu或者是上述我讲述的其他激活函数。同时在使用激活函数有几个需要注意的地方,比如Learing_rate的设置要合理,太小的话,学习的速度太慢,太大,可能无法收敛,还有就是,一般来说,一个网络,使用一种激活函数,很少交叉混合使用。2.4池化层池化同样是卷积神经网络中的一个常见操作,池化函数有很多种,在卷积神经网络中,使用最多的池化函数是最大池化(MaxPooling),而且它不仅是使用最多的,也是最简单的。最大池化通过把输入的图片划分成一个个矩形区域,直接把每个区域的最大值输出,如果最大池化的矩阵大小选择合适,那么不仅可以降低数据量,而且可以保留大部分图像信息,假如我们选择一个2*2大小的最大池化函数,那么得到的结果与原图差距并不大,然而数据量变为了原来的1/4。不管是哪种池化操作,它都会使输入数据量变小,由此降低参数量和计算量,并同时降低过拟合的风险。过拟合的直观表现为,模型在训练集上的表现极好,但是到了测试集,或者对新样本进行预测时,表现明显变差,出现这种情况,很可能就是发生了过拟合。我们希望的是,对数据的学习,要学习到数据背后一般的规律,但是过度学习,可能会把数据的一些独特的特点当作规律进行学习,导致泛化能力变差。一般来说,池化层穿插与卷积层中,目前最常使用的最大池化函数,当矩阵大小w和步长s设置好后,2个值也就固定了,并且由于w和s不需要进行学习,所以不会产生变化,它的梯度下降为固定值。2.5全连接层全连接层的作用对最后的结果进行分类。其实就像前面讲述的感受野的概念,卷积层的卷积操作不是全连接而是局部连接,卷积层是为了提取特征,所以不需要用到全连接,采用局部连接可以有效减低网络的参数和计算难度。卷积层的作用是提取特征,而全连接层就是根据这些特征来进行分类,起一个分类器的作用[6]。用通俗的话来解释卷积层和全连接层的作用,计算机判断一张图片是不是猫,先通过卷积层获取图片的特征,因此如图2.5,我们获取猫的一些特征,比如脸、尾巴、身体等等,然后在全连接层汇总,如图2.6,通过这些特征,我们来判断该图片是不是一只猫。图2.5特征提取图2.6全连接层示意这里介绍Softmax,它是卷积神经网络常用的一个分类器,使用Softmax可以对多个类别进行分类,Softmax其实可以算作是对线性模型中的logistics模型的一个推广[7]。Softmax最适合使用的损失函数同样是交叉损失函数,这是由于样本结果分布不符合高斯分别,而是更符合伯努利分布,因而从概率意义得知,或者说是通过推导我们可以得知,交叉熵损失函数是最适合Softmax的一个损失函数。交叉熵损失函数:损失函数是用于数学模型来评估预测与真实之间的差距,假设你的输入为X,通过模型的输出结果我们设置为f(X),如果真实值为Y,那么f(X)越接近与Y我们认为该模型的预测效果越好,当然,最好肯定是等于。这里给出交叉熵损失函数的公式,其中a是神经网络的实际输出,y是期望输出也即是真实情况:(2.12式)交叉熵损失函数一般是用于分类任务的损失函数,回归任务,最小二乘法比较常用。Softmax的函数公式如下:(2.13式)其示意图如下:图2.7Softmax作为输出层

3手写数字识别3.1手写数字识别介绍网络模型通过Tensorflow中的keras的Sequential来搭建。Tensorflow广泛使用与机器学习以及深度学习任务,该模块将底层封装的很好,大大降低了机器学习以及深度学习的难度以及门槛,而keras是对Tensorflow里面的一些内容再次进行封装或者进行一定修改而形成的高级API,使用keras构建和训练模型,将会更方便更简单,而且代码的可读性也有所提高,在keras中,我们通常通过组装图层来构建模型,而其中最常使用的就是Sequential模型。Sequential模型,能够很轻松的完成各种CNN网络结构的构造,对模型的修改也很方便。通过修改模型的结构以及模型的参数,观察模型结构的改变、参数设置的不同对验证集和训练集准确率的影响,而且为了降低偶然性对结果的影响,每次测试我们连续进行三次,然后取其中的平均值,最后来分析准确率变化的原因。在本次项目中,数据集我们采用的是MNIST数据集,该数据集为python官方(

/exdb/mnist/)所提供,其中训练集包含60000张手写数字图片,验证集包含10000张手写数字图片,每张图片的大小都是28*28*1,这里给出训练集中的部分图片:图3.1训练集图片展示3.2模型与参数分析最开始,构建的是一个简单的CNN网络,总共包括5层结构,第一层是卷积层,卷积核有32个,其大小为5*5,激活函数为relu,第二层为池化层,采用的池化方式为最大池化,大小为2*2,第三层为flatten层,将数据变为n*1的矩阵(扁平化),第四层为全连接层,该层输出为128个神经元,激活函数为relu,第五层也是全连接层,该层采用的激活函数为softmax,用于对数据进行最后的分类,网络模型结构如下图:图3.2网络模型1当训练集数量为60000,验证集的数量为10000,batch_size为128时,观察 随着epochs的增长,训练集和验证集的准确率有如何的变化。下面展示epochs的次数与准确率的变化图:图3.3accuracy随epochs变化在图3.3中可以看到,随着epochs的增加,训练集的准确率最高达到了99.9%,验证集准确率最高达到了99.2%,但训练集和验证集的准确率变化各不相同,训练集整体来说都是呈上升趋势,而验证集在第6次以后就趋于平稳,之后已经没有什么变化,所以在这个模型中,epochs设置为7就行了,因为epochs为7时,验证集的准确率为99.1%,在后面即使随着epochs的上升,训练集的准确率在逐步上升,但是泛化能力并没有上升,而且可能还会导致过拟合。接下来,我们测试一下改变训练集和验证集的数量,准确率和损失函数的值会有怎样的变化,该测试中,我们将epochs设置为7,观察随着训练集的数据量上升,训练集和验证集的准确率有着怎样的改变,如下图:图3.5训练集数据量对准确率的影响在图3.5中只标注了训练集的数据量变化,但是其实在这次实验中,训练集的数据量与验证集的数据量之比为6:1。在本次测试中,训练集准确率最高的时候是训练集数据量为40000的时候,达到了99.6%,验证集准确率最高的时候是训练集数据量为50000的时候,达到了98.7%,可以看出,无论是是训练集还是测试集,在数据量不足时,随着数据量提升,准确率有明显的提升,但是在数据量足够大之后,继续增加数据量,准确率提升不大甚至可能还有降低的情况。继续观察,在训练集数据量为30000,epochs为7时,训练集和验证集的准确率有着怎样的改变,如下图:图3.6Batch_size对准确率的影响由图3.6可看出,当batch_size=16时,训练集有着最高的准确率,为99.7%,当batch_size=112,验证集的有最高准确率,为98.2%。当训练集的准确率最高的时候,此时验证集的准确率为97.7%,也许有过拟合的倾向。最后我们来试试更改网络模型对准确率由怎样的影响。新模型为8层结构,同时每次池化或者除了最后一次的全连接层之后,都加入一个dropout,新模型第一、二层和原模型一样,第三层变为卷积层,卷积核的数量为15,大小为3*3,第4次和原模型第二层一样,同样的池化层,第五层为flatten层,第六层为全连接层,输出为128个神经元,第七层也是全连接层,输出为64个神经元,第八层是输出层,采用softmax进行最后的分类,函数模型如下:图3.7网络模型2接下来观察在训练集数据量为60000,batch_size为256,随着epochs增长,训练集和测试集的准确率有何变化,如下图:图3.8accuracy随epochs变化如图3.8,随着epochs的增加,训练集和验证集的准确率都在上升,但是验证集在第7次以后的上升幅度已经很不明显了,验证集最高准确率达到了98.8%,对比与原本的模型,准确率反而有一点点的下降,这说明模型不是越复杂,效果就一定越好。4.总结在该项目中,我们验证集准确率最高达到了99.2%,这已经是一个很好的结果。在我们对参数和模型和参数的修改而导致准确率的变化,可以清晰的看到,不同的模型,不同的参数,对于最后训练集和验证集的准确率都有着影响,而且对于模型和参数的选择,我们没有好的方法来直接找到最合适的模型和参数,只能靠我们慢慢尝试,找到合适的模型和参数设置。所以在实际中,我们在模型和参数的选择中要多加尝试,模型不是越复杂越好,参数也不是越大越好,都需要我们仔细选择才能有最好的结果。而且,在本项目中,不论我们如何修改模型和参数,最后都有很好的效果,这是是什么原因?我认为很可能有以下几个原因,首先是数据都是单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论