读书报告研究报告 1.docx
《读书报告研究报告 1.docx》由会员分享,可在线阅读,更多相关《读书报告研究报告 1.docx(13页珍藏版)》请在冰豆网上搜索。
读书报告研究报告1
2014学年第二学期研究生课程考核
(读书报告、研究报告)
考核科目:
智能控制
学生所在院(系):
电子信息工程学院
学生所在学科:
控制理论与控制工程
姓名:
高韵
学号:
1304210221
题目:
基于BP神经网络的字母识别
1.背景介绍
1.1.课题研究背景
为了解决计算机字符的自动识别、高速加工处理,使计算机达到真正智能化,人们对计算机识别进行了多年的研究,并取得了很大的进步。
数字和子母识别是字符识别的一个分支,一般通过特征匹配及特征判别的方法来进行处理,目前识别率还较低。
因此,为了提高识别率,还要寻求新的方法和途径。
近年来,人工神经网络技术取得了巨大的发展,它所具有的优势:
固有的并行结构和并行处理、知识的分布存储、容错性、自适应性、模式识别能力,为手写体数字识别开辟了新的途径。
字母识别作为模式识别的一个重要分支,在邮政、税务、交通、金融等行业的实践活动中有着及其广泛的应用。
字母识别作为模式识别领域的一个重要问题,也有着重要的理论价值。
一方面,阿拉伯数字是世界各国通用的符号,因此,数字是一个重要枢纽。
在符号识别领域,数字识别为这一领域提供了一个算法研究的平台。
另一方面,数字的识别方法很容易推广到其它一些相关问题,特别是对英文字母的识别,但到目前为止机器的识别本领还无法与人的认知能力相比,这仍是一个有难度的开放问题。
1.2.发展现状以及研究意义
实际上,神经网络系统设计时,从应用者的角度出发,重点就是如何选择或确定适当的网络结构及其参数,这需要神经网络方面的专业知识,但如何很好地利用MATLAB中已有的网络函数,更好解决工程实际问题,就是本文要讨论的重点问题.而数字和子母识别作为模式识别的一个分支。
在日常生活和科研中具有十分重要的作用。
数字和子母识别的算法一般是采用以知识、神经网络、人工智能为基础的模板匹配法、轮廓多边形相关、傅立叶系数法等方法来进行识别的。
以上方法识别效率高,但是实现较为复杂。
在交通,税务,金融等领域字母识别起到了很重要的作用。
比如在交通中对于车牌的识别都大量运用了数字和字母识别的功能。
2BP网络模型介绍
2.1BP网络模型
BP网络是一种单向传播的多层前向网络[2],每一层节点的输出只影响下一层节点的输出,其网络结构如图1所示,其中X和U分别为网络输入、输出向量,每个节点表示一个神经元。
网络是由输入层、隐层和输出层节点构成,隐层节点可为一层或多层,同层节点没有任何耦合,前层节点到后层节点通过权连接。
输入信号从输入层节点依次传过各隐层节点到达输出层节点。
采用BP算法的多层感知器是至今为止应用最广泛的神经网络,在多层感知器的应用中,一般习惯将单隐层感知器称为三层感知器,所谓三层包括了输入层、隐层和输出层。
图1三层BP网
三层感知器中,输入向量为
,隐层输出向量为
,输出层输出向量为
,期望输出向量为
,输入层到输出层的权值为
,隐藏层到输出层的权值矩阵为
,各层之间的信号关系如下:
对输出层有:
对隐藏层有:
上式中,变换函数f(x)均为单极性sigmoid函数
F(x)具有连续可导的特点,
以上共同构成三层感知器的数学模型
2.2BP网络算法思想
BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。
正向传播时,输入样本从输入层传入。
经各层逐层处理后,传向输出层。
若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。
误差反传是将输出误差以某种形式通过隐层向输入层逐层反传、并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。
这种信号正向传播与误差反向传播的各层权值调整过程,是周而复始的进行的。
权值不断调整的过程,也就是网络的学习训练过程。
此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。
3研究问题方案
字符识别是模式识别领域的一项传统课题,这是因为字符识别不是一个孤立的问题,而是模式识别领域中大多数课题都会遇到的基本问题,并且在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而字符识别的研究仍具有理论和实践意义。
这里讨论的是用BP神经网络对26个英文字母的识别。
在对字母进行识别之前,首先必须将字母进行预处理,即将待识别的26个字母中的每一个字母都通过的方格形式进行数字化处理,其有数据的位置设为1,其他位置设为0。
如图2给出了字母A、B和C的数字化过程,然后用一个1×35的向量表示。
例如图2中字母A的数字化处理结果所得对应的向量为:
LetterA=[00100010100101010001111111000110001]
由此可得每个字母由35个元素组成一个向量。
由26个标准字母组成的输入向量被定义为一个输入向量矩阵alphabet,即神经网络的样本输入为一个35×26的矩阵。
其中alphabet=[letterA,letterB,lettereC,……letterZ]。
网络样本输出需要一个对26个输入字母进行区分输出向量,对于任意一个输入字母,网络输出在字母对应的顺序位置上的值为1,其余为0,即网络输出矩阵为对角线上为1的26×26的单位阵,定义为target=eye(26)。
本文共有两类这样的数据作为输入:
一类是理想的标准输入信号;另一类是在标准输入信号中加上用MATLAB工具箱里的噪声信号,即randn函数。
3 .1网络设计及其试验分析
为了对字母进行识别,所设计的网络具有35个输入节点和26个输出节点,对于隐含层节点的个数的选取在后面有详细的介绍。
目标误差为0.0001,从输入层到隐层的激活函数采用了S型正切函数tansig,从隐层到输出层的激活函数采用了S型对数函数logsig,这是因为函数的输出位于区间[0,1]中,正好满足网络输出的要求。
3.2隐层节点个数的确定
根据BP网络的设计目标,一般的预测问题都可以通过单隐层的BP网络实现。
难点是隐层节点个数的选择,隐层节点数对网络的学习和计算特性具有非常重要的影响,是该网络结构成败的关键。
若隐层节点数过少,则网络难以处理复杂的问题;但若隐层节点数过多,则将使网络学习时间急剧增加,而且还可能导致网络学习过度,抗干扰能力下降。
目前为止,还没有完善的理论来指导隐层节点数的选择,仅能根据Kolmogorov定理,和单隐层的设计经验公式[4],并考虑本例的实际情况,确定隐层节点个数应该介于8~17之间。
本文设计了一个隐层节点数目可变的BP网络,通过误差对比,确定最佳的隐层节点个数,具体程序如下:
[alphabet,targets]=prprob;
p=alphabet;
t=targets;
s=8:
17;
res=zeros(1,10);
res2=zeros(1,10);
fori=1:
10
fprintf('s(i)=%.0fn',s(i));
net=newff(minmax(p),[s(i),26],{'tansig','logsig'},'traingdx');
net.trainParam.epochs=1000;
net.trainParam.goal=0.0001;
[net,tr]=train(net,p,t);
y=sim(net,p);
error=(y(1,:
)-t(1,:
)).^2;
error2=(y(2,:
)-t(2,:
)).^2;
res(i)=norm(error);
res2(i)=norm(error2);
pause
i=i+1;
end
通过网络的输出显示以及网络训练速度和精度因素,选取隐层节点的最佳个数为11。
3.3生成网络
使用函数newff创建一个两层网络,具体函数为:
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
P=alphabet;
S1=12;%%隐层节点数
net=newff(minmax(alphabet),[S1S2],{'logsig''logsig'},'traingdx');
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}*0.01;
T=targets;
3.4网络训练
为了使产生的网络对输入向量有一定的容错能力,最好的办法是使用理想的信号(无噪声)和带有噪声的信号对网络进行训练。
使用不同信号的训练都是通过BP网络来实现的。
因此,可首先进行无噪声网络训练,再进行有噪声字母网络训练,最后再次进行无噪声网络训练[4],具体程序如下:
%<1>无噪声字符网络的训练
net.performFcn='sse';
net.trainParam.goal=0.1;
net.trainParam.show=20;
net.trainParam.epochs=5000;
net.trainParam.mc=0.95;
P=alphabet;
T=targets;
[net,tr]=train(net,P,T);
%<2>具有噪声字符网络的训练
netn=net;
net.trainParam.goal=0.6;
net.trainParam.epochs=300;
T=[targetstargetstargetstargets];
forpass=1:
10
P=[alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2,alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2];
[netn,tr]=train(netn,P,T);
end
%<3>再次无噪声网络训练
netn.trainParam.goal=0.1;
netn.trainParam.show=5;
net.trainParam.epochs=500;
P=alphabet;
T=targets;
[netn,tr]=train(netn,P,T);
4系统性能测试
为了测试系统的可靠性,本文用了加入不同级别的噪声的字母样本作为输入,来观察用理想样本和加噪样本训练出来的网络的性能,并绘制出误识率曲线,如图4所示。
图3识别误差曲线
图3中虚线代表用无噪声训练网络的出错率,实线代表有噪声训练网络的出错率。
从图3可以看出,在均值为0~0.07之间的噪声环境下,两个网络都能够准确地进行识别。
当所加的噪声均值超过0.07时,待识别字符在噪声作用下不再接近于理想字符,无噪声训练网络的出错率急剧上升,此时有噪声训练网络的性能较优。
4仿真结果
对上面设计的系统进行实验仿真验证,如对字母A、C.V进行识别:
图4字母验证
程序运行结果如图5所示,奇数行是比例为30%噪声下的字母,偶数行为成功识别的字母。
图526个字母识别
5结论
本文利用BP网络对有噪声的字母进行识别和仿真,结果表明此网络具有联想记忆和抗干扰功能,对字母具有一定的辨识能力,是一种对字母识别的有效方法。
附录程序
[alphabet,targets]=prprob;
p=alphabet;
t=targets;
s=8:
17;
res=zeros(1,10);
res2=zeros(1,10);
fori=1:
10
printf('s(i)=%.0fn',s(i));
net=newff(minmax(p),[s(i),26],{'tansig','logsig'},'traingdx');
net.trainParam.epochs=1000;
net.trainParam.goal=0.0001;
[net,tr]=train(net,p,t);
y=sim(net,p);
error=(y(1,:
)-t(1,:
)).^2;
error2=(y(2,:
)-t(2,:
)).^2;
res(i)=norm(error);
res2(i)=norm(error2);
pause
i=i+1;
end
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
P=alphabet;
S1=11;%%隐层节点数
net=newff(minmax(alphabet),[S1S2],{'logsig''logsig'},'traingdx');
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}*0.01;
T=targets;
net.performFcn='sse';
net.trainParam.goal=0.1;
net.trainParam.show=20;
net.trainParam.epochs=5000;
net.trainParam.mc=0.95;
P=alphabet;
T=targets;
[net,tr]=train(net,P,T);
netn=net;
net.trainParam.goal=0.6;
net.trainParam.epochs=300;
T=[targetstargetstargetstargets];
forpass=1:
10
P=[alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2,alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2];
[netn,tr]=train(netn,P,T);
end
netn.trainParam.goal=0.1;
netn.trainParam.show=5;
net.trainParam.epochs=500;
P=alphabet;
T=targets;
[netn,tr]=train(netn,P,T);
noise_range=0:
.05:
.5;
max_test=100;
network1=[];
network2=[];
T=targets;
fornoiselevel=noise_range
%fprint('Testingnetworkswithnoiselevelof%.2f\n',noiselevel);
errors1=0;
errors2=0;
fori=1:
max_test;
P=alphabet+randn(35,26)*noiselevel;
A=sim(net,P);
AA=compet(A);
errors1=errors1+sum(sum(abs(AA-T)))/2;
An=sim(netn,P);
AAn=compet(An);
errors2=errors2+sum(sum(abs(AAn-T)))/2;
end
network1=[network1errors1/26/100];
network2=[network2errors2/26/100];
end
echoon
clf
plot(noise_range,network1*100,'--',noise_range,network2*100);
title('识别误差');
xlabel('噪声指标');
ylabel('无噪声训练网络--有噪声训练网络--');
noisyJ=alphabet(:
1)+randn(35,1)*0.2;%对字母A加噪声
figure
plotchar(noisyJ);%绘图
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure
plotchar(alphabet(:
answer));%输出识别结果
noisyJ=alphabet(:
3)+randn(35,1)*0.2;
figure
plotchar(noisyJ);
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure
plotchar(alphabet(:
answer));
noisyJ=alphabet(:
22)+randn(35,1)*0.2;
figure
plotchar(noisyJ);
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure
plotchar(alphabet(:
answer));
noise_percent=0.3;
fork=1:
26
noisyChar=alphabet(:
k)+randn(35,1)*noise_percent;
subplot(6,9,k+floor(k/9.5)*9);
plotchar(noisyChar);
de_noisyChar=sim(net,noisyChar);
de_noisyChar=compet(de_noisyChar);
answer=find(de_noisyChar==1);
subplot(6,9,k+floor(k/9.5)*9+9);
plotchar(alphabet(:
answer));
end
set(gcf,'Position',[10,60,900,700],'color','w')
第1页(共页)