实验报告 BP神经网络2150230509资料.docx
《实验报告 BP神经网络2150230509资料.docx》由会员分享,可在线阅读,更多相关《实验报告 BP神经网络2150230509资料.docx(12页珍藏版)》请在冰豆网上搜索。
实验报告BP神经网络2150230509资料
深圳大学实验报告
实验课程名称:
神经网络与进化算法
实验项目名称:
BP神经网络对蝴蝶花进行分类
学院:
计算机与软件专业:
软件工程
报告人:
文成学号:
2150230509
同组人:
无
指导教师:
朱安民
实验时间:
2016年4月1日至2016年4月7日
实验报告提交时间:
2016年4月7日
教务处制
一、实验目的
初步熟悉BP神经网络,并设计一个BP神经网络对蝴蝶花进行分类
二、实验内容
设计一个BP神经网络对蝴蝶花进行分类,要求提交试验报告,内容包括:
1.问题说明描。
2.数据述。
3.网络设计,包括输入层、隐含层、输出层节点个数的设计。
4.算法步骤。
5.编程,注意原始数据的通用化,数据输入的随机性。
6.网络训练,注意训练数据与验证数据分开。
7.网络验证
7.结果分析,修改隐含层节点个数,修改学习率,分别对结果的影响。
8.体会,例如对下列问题的理解:
1)BP学习算法的基本思想?
2)BP网络设计中结点个数如何确定?
3)为什么要对数据进行通用标准化,即转为[-1,1]?
4)为什么要对训练数据的输入顺序进行随机化处理?
5)为什么训练数据与测试数据要分开?
注意:
如果用MatLab编程序,将下列数据存放到一个文本文件(例如data.dat),编写程序存放到一个m文件中(例如你的学号.m),数据文件和程序文件放在同一文件夹下。
运行MatLab后,指定上述文件夹为工作区域,在命令行运行m文件。
三、
实验步骤
前期工作:
首先将实验数据分为两组,一组用于训练,一组用于测试。
分别保存在trainData.txt和testData.txt中(115组训练数据和35组测试数据)。
如图所示:
各列数据代表的意义如下:
序号种类叶长叶宽花长花宽(单位:
cm)
114930142
2266294613
…
150365336025
(本实验设计一个BP网络,先用75%的数据对网络进行训练,然后用25%的数据进行检测。
)
网络设计:
输入层用4个节点,分别对应文件中的3/4/5/6列,隐层用3个节点。
因为输出有3类,我们也用3个节点来表示,分别对应100/010/001。
算法描述:
BP学习算法类似于LMS算法,它是基于梯度下降:
即权值按照错误信号的负梯度方向进行修改。
其主要优点在于将高层的错误表现反向传递为低层,从而修改权值。
第一步,初始化权值随机赋值,取值范围[-1,+1]
第二步,输入层FA输入样品,计算出隐层FB活动
第三步,计算出输出层FC活动
第四步,网络输出和期望输出相比较,计算出输出层FC的错误
第五步,反传,计算出隐层FB的错误
第六步,修改FC层和FB之间的权值wij
第七步,修改FA层和FB之间的权值vhj
第八步,修改偏差i、j
重复第二到第八步,直到输出层FC的错误足够小
MATLAB编程:
使用Matlab建立前馈神经网络主要会使用到下面3个函数:
newff:
前馈网络创建函数
train:
训练一个神经网络
sim:
使用网络进行仿真
MATLAB代码如下,根据隐含层节点个数、学习率、激活函数的选择不同只需要要稍作修改。
%读取训练数据
[id,class,f1,f2,f3,f4,]=textread('trainData.txt','%f%f%f%f%f%f');
%特征值归一化
[input,minI,maxI]=premnmx([f1,f2,f3,f4]');
%构造输出矩阵
s=length(class);
output=zeros(s,3);
fori=1:
s
output(i,class(i)+1)=1;
end
%创建神经网络
net=newff(minmax(input),[33],{'logsig''logsig'},'traingdx');
%设置训练参数
net.trainparam.show=50;
net.trainparam.epochs=1500;
net.trainparam.goal=0.01;
net.trainParam.lr=0.01;
%开始训练
net=train(net,input,output');
%读取训练数据
[id2ct1t2t3t4]=textread('testData.txt','%f%f%f%f%f%f');
%测试数据归一化
testInput=tramnmx([t1,t2,t3,t4]',minI,maxI);
%仿真
Y=sim(net,testInput)
%取最大者为1的位置作为识别结果
[resultmax,r]=max(Y);
testclass=r'-1;
%统计识别正确率
[s1,s2]=size(Y);
hitNum=0;
fori=1:
s2
[m,Index]=max(Y(:
i));
if(Index==c(i)+1)
hitNum=hitNum+1;
end
end
sprintf('ʶ±ðÂÊÊÇ%3.3f%%',100*hitNum/s2)
%输入到隐层权值
w1=net.iw{1,1}
%隐层阙值
bias1=net.b{1}
%隐层到输出层权值
w2=net.lw{2,1};
%输出层阙值
bias2=net.b{2}
以上程序的识别率稳定在94%左右,训练250次左右达到收敛,训练曲线如下图所示:
我们也可以用下面的语句来定位有误差的数据:
plot(id2,c)%预测数据
holdon%此命令能使所绘制的图形发生在已有的同一张纸上
plot(id2,testclass)%已知数据
holdoff
本例中我得出的结果是(训练的结果是不同的)
输入到隐层的权值:
w1=
16.37955.2873-5.1517-1.2917
0.9802-3.2833-0.3474-0.3002
5.94882.2175-2.62891.2639
隐层到输出层权值:
w2=
-3.36281.1942-11.3182
9.4958-11.6694-4.0900
-16.82-4.16067.9779
隐层阙值:
bias1=
-9.3618
0.4042
3.9510
输出层阙值:
bias2=
4.9943
5.7593
-0.4679
结果分析:
我在实验中尝试调整隐含层结点的个数,选择不同的激活函数,设定不同的学习率,说明如下:
<1>隐含层节点个数
隐含层节点的个数对于识别率的影响并不大,但是节点个数过多会增加运算量,使得训练较慢。
<2>激活函数的选择
激活函数无论对于识别率或收敛速度都有显著的影响。
在逼近高次曲线时,S形函数精度比线性函数要高得多,但计算量也要大得多。
上面的代码中我用的是'logsig''logsig',识别率只有94%,但我换了'logsig''purelin'后发现识别率接近100%。
<3>学习率的选择
学习率影响着网络收敛的速度,以及网络能否收敛。
学习率设置偏小可以保证网络收敛,但是收敛较慢。
相反,学习率设置偏大则有可能使网络训练不收敛,影响识别效果。
Thetableshowsthedifferentresult
Case
Hiddennodes
Permittederror
Learningrate
Epoch
Accuracy(100%)
1
3
0.01
0.01
1241
94.286
2
6
0.01
0.01
1147
94.286
3
9
0.01
0.01
1067
94.286
4
3
0.005
0.01
1196
94.286
5
3
0.01
0.005
583
97.143
6
3
0.01
0.5
1159
94.286
7
3
0.3
0.3
43
28.571
8
3
0.05
0.3
111
94.286
9
3
0.3
0.05
97
71.429
10
6
0.3
0.05
96
54.286
(因为测试数据只有35组,所以准确率反映的情况不好,33/35即94%,34/35期97%)
当学习率和允许的误差太大的时候,训练情况是不收敛的。
对于本例来说,而当Permittederror和Learningrate合适的时候准确率基本稳定在94%。
四、总结分析
由于对MATLAB的不熟悉,自己将BP神经网络实现出来还是有难度的,于是我学习使用了MATLAB自带的神经网络工具箱,进而了解怎么样使用BP神经网络来进行蝴蝶花的分类。
思考题:
1)为什么要对数据进行通用标准化,即转为[-1,1]?
答:
输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。
例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
2)为什么要对训练数据的输入进行随机化处理?
答:
BP网络本质上是个支持向量机,对输入顺序进行随机化处理是为了保证能够有监督学习,同时使算法按照梯度下降法则进行学习。
假如训练数据是有序的,那么会导致训练结果很难收敛到偏置值。
只有保证数据的随机性才能使得BP算法训练结果尽可能地收敛。
3)为什么训练数据与测试数据要分开?
答:
用于测试的数据不能参与训练,否则识别度肯定是100%,我们的目的是通过对训练数据的学习来预测未知的数据。
4)BP网络设计中结点的个数如何确定?
答:
并没有准确的确定方法,只要合理即可。
输入层和输出层的结点数量要足够表示,隐含层结点数量视情况而定。
5)BP学习算法的基本思想?
答:
BP算法,误差反向传播(ErrorBackPropagation,BP)算法。
BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。
由于多层前馈网络的训练经常采用误差反向传播算法,人们也常把将多层前馈网络直接称为BP网络。
指导教师批阅意见:
√
实验报告内容的确完整性
(20分)
实验步骤的清晰程度
(20分)
实验数据的准确性
(20分)
实验结果和分析的正确性
(20分)
实验态度(实验表现、格式排版、独立完成、按时提交)(20分)
完整
20
较完整
15
不够完整
10
清晰
20
较清晰
15
不够清晰
10
准确
20
较准确
15
不够准确
10
正确
20
较正确
15
不够正确
10
规范
20
较规范
15
不够规范
10
说明:
说明:
说明:
说明:
说明:
成绩评定:
指导教师签字:
朱安民
2016年4月10日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。