人工神经网络设计课程报告byHHU.docx
《人工神经网络设计课程报告byHHU.docx》由会员分享,可在线阅读,更多相关《人工神经网络设计课程报告byHHU.docx(55页珍藏版)》请在冰豆网上搜索。
人工神经网络设计课程报告byHHU
人工神经网络课程报告
姓名:
张进
学号:
151307040035
专业:
计算机科学与技术
指导老师:
曾晓勤
2015年12月
基于BP神经网络的英文字母识别技术报告
摘要:
本技术报告主要介绍了利用BP神经网络进行英文字母的识别主要过程,为了检测网络的容错性能和抗干扰能力,试验中我还准备了隐藏16%和33%样本数据,因为题目中没有特别要求,故本次实验程序的编写主要使用了作者较为熟悉的JAVA语言。
关键词:
BP神经网络;噪声干扰;模式识别;JAVA语言
一、项目设计题目
用多层感知机网络实现对样本图像A-Z的识别,输出相应的数值0-25,通过分析实验结果讨论感知机网络的识别和容错性能。
二、实验设计概要
1、实验数据预处理
模式识别应用的领域非常广泛,其中字母的识别是一个经常研究的课题。
由于在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而字符识别的研究仍具有理论和实践意义。
这里讨论的是用BP神经网络对26个英文字母的识别,BP网络算法是学者Rumelhart、McClelland和他们的同事在20世纪80年代中期提出的多层前馈网络MFNN(MutltilayerFeedforward Neural Networks)的反向传播学习算法。
BP网络是对非线性可微分函数进行权值训练的多层前向网络。
。
在对字母进行识别之前,需要将字母进行预处理,即将待识别的26个字母中的每一个字母都通过的方格形式进行数字化处理,其有数据的位置设为1,其他位置设为-1。
如图1给出了字母A、B和C的数字化过程。
下面给出了字母A的数字化处理结果,是用一个1*30向量表示,其结果为:
P[0][30]={-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1};其他字母对应的向量也做类似的处理。
最终的标准输入矩阵P[26][30],包含26个字母向量。
-1
-1
1
-1
-1
-1
1
-1
1
-1
1
-1
-1
-1
1
1
1
1
1
1
1
-1
-1
-1
1
1
-1
-1
-1
1
-1
1
1
1
-1
1
-1
-1
-1
1
1
-1
-1
-1
-1
1
-1
-1
-1
-1
1
-1
-1
-1
1
-1
1
1
1
-1
1
1
1
1
-1
1
-1
-1
-1
1
1
1
1
1
-1
1
-1
-1
-1
1
1
-1
-1
-1
1
1
1
1
1
-1
ABC
图1字母数字化样式
2、网络的初始设计
本次网络主要选择如图2所示的网络结构,其中有一个输入层,一个隐含层,一个输出层,网络结构为30-30-1,其中
,
。
图2网络结构
本次如图2所示的网络中,p为待输入的学习(识别)向量,因为每个字母都有30个元素的向量表示,所以p的维数为30*1,w1为第一层权值,维数30*30,w2为第二层权值,维数30*1,b1为第一层偏值,维数30*1,b2为第二层偏值,维数1*1,a1为第一层输出,维数30*1,a2为网络最后的输出,至此基本的网络结构初始设计完毕。
3、初始化各项参数
本次初始化参数主要包括初始化隐含层第一层的权值w1[30][30]和偏置值b1[30],初始换隐含层第二层的权值w2[30]和偏置值b2,本次实验选取的初始值为0-0.5之间的随机实数。
其中随机实数可以通过调用JAVA语言的random()方法得到。
对于学习速度α可以先设置为:
α=0.01,当然,也可以在后面的实验过程中不断的调节α的值使得学习的更快更好,具体代码实现见附录。
4、前向传播设计
在前面工作完成的基础上,首先需要根据BP算法的公式
和
计算第一层网络的输出a1,然后根据公式
计算出最后输出层的a2,这就是BP神经网络的前向传播过程。
最后根据
计算出误差e,具体代码实现见附录。
5、敏感性计算
由于在计算敏感性之前需要用到传输函数的导数,故需要提前计算出来。
具体导数推导如式(5.1)和式(5.2)所示:
(5.1)
(5.2)
然后根据式(5.1)和式(5.2)可以得到s2的计算公式
和第一层敏感性s1的计算公式
,具体代码实现见附录。
6、权值和偏值的更新
这里需要用到我之前设置的学习速度α,实验中可以尝试修改α的值,观察实验效果。
具体的权值偏值计算可以根据公式(6.1)、公式(6.2)、公式(6.3)、公式(6.4)计算得到,具体代码实现见附录。
(6.1)
(6.2)
(6.3)
(6.4)
7、测试网络性能
BP算法需要不停地迭代去更新权值和偏置直至某次迭代后误差e满足了实验的要求或者达到了最大的迭代次数。
学习后预期的效果应当是当使用训练样本给BP网络识别时,它能够识别出字母A-Z,输出对应的数字0-25;当使用隐藏部分数据的样本给它识别时,如果它能够识别多数A-Z破损数据,说明该BP网络的抗干扰、容错能力较强,反之如果大部分无法识别,则说明本网络容错能力较差。
3、实验结果展示
1、实验一
学习速度a=0.1,误差e=0.01,迭代次数m=2000,学习结束效果如图3所示。
图3实验一结果部分展示
2、实验二
学习速度a=0.01,误差e=0.01,迭代次数m=2000,实验结果如图4所示。
图4实验二结果部分展示
3、实验三
学习速度a=0.01,误差e=0.0001,迭代次数m=2000,实验结果如图5所示。
图5实验三结果部分展示
4、实验四
学习速度a=0.015,误差e=0.0001,迭代次数m=3000,实验结果如图6所示。
图6实验四结果部分展示
通过观察四次实验的效果图可以清楚的发现,学习速度,误差标准和迭代次数对识别的效果都有影响。
显然本次实验最合适的学习速度a=0.015,可以发现当学习速度不变时,误差选取的越小,迭代次数越大,则识别的效果越好。
5、实验五
为了简单的验证一下BP网络的容错能力,下面进行实验五,在原始数据p基础上隐藏最后一行(隐藏16%)进行识别,具体参数为:
a=0.015,e=0.0001,m=3000,实验结果如图7所示。
图7实验五结果部分展示
由图7可以发现,绝大部分破碎的数据无法被正确识别,小部分字母可以被识别。
因此可以说明本次实验构造的BP网络的容错性较差。
4、实验总结
本次实验主要实现基于BP网络的字母识别功能,通过实验我深入了解了BP算法的原理,能够通过编程搭建一个简单的BP网络。
在实验中通过调整学习速度,迭代次数,误差大小,实现了对BP网络性能的优化。
通过本次实验,我也体会到了BP算法还有有它很大的局限性的,比如:
训练次数多使得学习效率较低,算法的收敛速度较慢,易形成局部极小而得不到全局最优等。
在实验中,我发现当学习速度设为0.1的时候,算法的震荡较为验证,结果不好,并且需要的迭代次数大,但是当学习速度设为0.01时。
算法明显稳定很多,结果处理的好,需要的迭代次数少,能较快的给出相应的正确的结果。
附录
publicclassBP_Algorithm{
publicstaticvoidmain(Stringargs[]){//BP主方法
Datadata=newData();
show(data.p);//输出元数据
BP_init(data);//初始化参数
BP_learn(data,3000);//调用BP学习算法,5200为学习迭代次数,可以调节
BP_test(data,data.p);//测试BP算法的正确性
BP_test(data,data.p_test_16);//测试隐藏了16%数据的正确性
BP_test(data,data.p_test_33);//测试隐藏了33%数据的正确性
}
staticvoidshow(floatp[][]){//根据矩阵用*打印出字幕图像的方法
inti,j,k;
for(i=0;i<26;i++)
{
for(j=0;j<6;j++)
{
for(k=0;k<5;k++)
{
if(p[i][j+6*k]==1)
{
System.out.print("*");
}
else
{
System.out.print("");
}
}
System.out.println();
}
System.out.println();
}
}
staticvoidBP_init(Datadata){
//初始化参数方法,给权值和偏值赋初值(w1,w2,b1,b2)
inti,j;
for(i=0;i<30;i++)
{
for(j=0;j<30;j++)
{
//调用java的random方法生成0~0.5之间的实数
data.w1[i][j]=(float)((Math.random())/2.0);}
data.w2[i]=(float)((Math.random())/2.0);
data.b1[i]=(float)((Math.random())/2.0);
}
data.b2=0.48f;
}
staticvoidBP_learn(Datadata,intcount){//BP算法的学习过程,其中m为迭代次数
inti,j,m;
for(m=0;m{
for(i=0;i<30;i++)//对于某一个字母一轮结束初始化a1,a2,s1,s2
{
data.a1[i]=0;
data.s1[i]=0;
}
data.a2=0;
data.s2=0;
if(m%26==0&&m!
=0&&(data.e/26)>=0&&(data.e/26)<=0.0001)//满足误差要求,结束迭代
{
System.out.println("OK,误差为:
"+data.e);
break;
}
elseif(m%26==0&&m!
=0)//一轮结束,重置均误差
{
data.e=0;
}
for(i=0;i<30;i++)//前向传播
{
for(j=0;j<30;j++)
{
data.a1[i]+=data.w1[i][j]*data.p[m%26][j];
}
}
for(i=0;i<30;i++)//使用s型函数计算第一层结果值
{
data.a1[i]=data.a1[i]+data.b1[i];
data.a1[i]=(float)(1/(1+Math.pow(Math.E,-data.a1[i])));
}
for(i=0;i<30;i++)//使用线性函数计算第二层结果值
{
data.a2=data.a2+data.w2[i]*data.a1[i];
}
data.a2=data.a2+data.b2;
data.e_true=(m%26)-data.a2;
data.e=data.e+data.e_true;//累加一次迭代的真实误差
data.s2=(-2)*data.e_true;//计算s2敏感性
for(i=0;i<30;i++)//针对计算第一层敏感性初始化F(n)
{
for(j=0;j<30;j++)
{
if(i==j)
{
data.temp[i][j]=(1-data.a1[i])*data.a1[i];
}
}
}
for(i=0;i<30;i++)//计算s1敏感性
{
data.s1[i]=data.temp[i][i]*data.w2[i];
data.s1[i]=data.s1[i]*data.s2;
}
for(i=0;i<30;i++)//第二层权值偏置值修正
{
data.w2[i]=data.w2[i]-data.a*data.s2*data.a1[i];
}
data.b2=data.b2-data.a*data.s2;
for(i=0;i<30;i++)//计算s2*a1
{
for(j=0;j<30;j++)
{
data.temp[i][j]=data.s1[i]*data.p[m%26][j];
}
}
for(i=0;i<30;i++)//第一层权值偏置值修正
{
for(j=0;j<30;j++)
{
data.w1[i][j]=data.w1[i][j]-data.a*data.temp[i][j];
}
}
for(i=0;i<30;i++)
{
data.b1[i]=data.b1[i]-data.a*data.s1[i];
}
}
}
//BP测试方法,输出结果
staticvoidBP_test(Datadata,floatp[][]){
inti,j,k;
for(i=0;i<26;i++)
{
for(j=0;j<6;j++)//展示测试数据
{
for(k=0;k<5;k++)
{
if(p[i][j+6*k]==1)
{
System.out.print("*");
}
else
{
System.out.print("");
}
}
System.out.println();
}
for(j=0;j<30;j++)//初始化网络第一层第二层输出
{
data.a1[j]=0;
}
data.a2=0;
for(j=0;j<30;j++)//前向传播
{
for(k=0;k<30;k++)
{
data.a1[j]+=data.w1[j][k]*p[i][k];
}
}
for(j=0;j<30;j++)
{
data.a1[j]=data.a1[j]+data.b1[j];
data.a1[j]=(float)(1/(1+Math.pow(Math.E,-data.a1[j])));
}
for(j=0;j<30;j++)
{
data.a2+=data.w2[j]*data.a1[j];
}
data.a2=data.a2+data.b2;
System.out.println("对应数字:
"+data.a2);
}
}
}
publicclassData{
//原始A-Z数据
protectedfloatp[][]={{-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1}//A
{1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1}//B
{-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1}//C
{1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1}//D
{1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1}//E
{1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1}//F
{-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1}//G
{1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1}//H
{-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1}//I
{-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}//J
{1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1}//K
{1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1}//L
{1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1}//M
{1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1}//N
{-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1}//O
{1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1}//P
{-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1}//Q
{1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1}//R
{-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1}//S
{1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1}//T
{1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1}//U
{1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1}//V
{1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1}//W
{1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1}//X
{1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1}//Y
{1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1}};//Z
//隐去33%的A-Z数据
protectedfloatp_test_33[][]={
{-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1}//A
{1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1}//B
{-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1}//C
{1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1}//D
{1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1}//E
{1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1}//F
{-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1}//G
{1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,