人工神经网络设计课程报告byHHU.docx

上传人:b****7 文档编号:10475816 上传时间:2023-02-13 格式:DOCX 页数:55 大小:231.11KB
下载 相关 举报
人工神经网络设计课程报告byHHU.docx_第1页
第1页 / 共55页
人工神经网络设计课程报告byHHU.docx_第2页
第2页 / 共55页
人工神经网络设计课程报告byHHU.docx_第3页
第3页 / 共55页
人工神经网络设计课程报告byHHU.docx_第4页
第4页 / 共55页
人工神经网络设计课程报告byHHU.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

人工神经网络设计课程报告byHHU.docx

《人工神经网络设计课程报告byHHU.docx》由会员分享,可在线阅读,更多相关《人工神经网络设计课程报告byHHU.docx(55页珍藏版)》请在冰豆网上搜索。

人工神经网络设计课程报告byHHU.docx

人工神经网络设计课程报告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,

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

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1