神经网络实验报告
一、实验目的和任务
1、掌握产生实验数据的方法;
2、掌握“时钟”的使用方法,记录程序运行时间;
3、掌握评估神经网络学习效果的指标方法;
4、模拟神经元模型,理解其工作原理;
5、模拟感知机网络,用 hebbu 规则和 BP 算法训练神经网络,用实验数据测
试两种算法学习效果的差异;
6、构建两层自组织映射(SOM)神经网络、两层 ART 神经网络或两层 hopfield
神经网络,并进行测试分析,比较不同网络的差异。
二、实验工具和方法
借助软件 MATLAB(R2009a)及其神经网络工具箱 Neural Network Toolbox
Version 6.0.2 进行实验的仿真和测试。
三、实验过程
1、实验数据的产生:
假设噪声数据服从均值为 0,方差为 1 的正态分布。首先在变量论域产生 100
个随机数,并利用函数表达式分别计算其相应函数值,最后分别叠加噪声数据,
得到与变量对应的 100 个实验数据。
(1) 函数数据的产生:
使用 MATLAB 生成均匀随机数的函数 rand(m,n),可生成在 m 行 n 列的在(0,1)
之间符合均匀分布的随机数。
x0=rand(1,100);
x=100*x0;
如此可生成在变量论域(0,100)之间的 100 个符合均匀分布的随机数。
假如用来生成实验数据的函数为
y
2
x
sin
x
,输入:
y1=x.^2+sin(x)
即可得到所需的函数数据。
(2) 噪声数据的产生
由于噪声数据服从均值为 0,方差为 1 的正态分布,使用 MATLAB 函数
randn(m,n),可生成在 m 行 n 列的在(0,1)之间符合要求的随机数。
y2=randn(1,100)
(3) 生成实验数据
将实验数据和噪声数据叠加:
y=y1+y2
2、“时钟”的使用方法
在编写 MATLAB 代码的时候,经常需要获知代码执行的实际时间,这就这
程序中用到即使函数。MATLAB 里提供了 cputime,tic/toc,etime 三种方法。
(1) cputime 方法
返回 MATLAB 启动以来的 CPU 时间,可以在程序代码执行前保存当时的
CPU 时间,然后在程序代码执行结束后用 cputime 减去之前保存的数值,就可以
获取程序实际运行的时间。
(2) tic/toc 方法
tic 用在程序代码首部,启动一个计时器;toc 放在程序代码末尾,终止计时
器并返回 tic 启动以来的总时间。
(3) etime 方法
etime(t1,t2)用来计算两个日期向量 t1,t2 之间的时间差。
3、神经网络性能的评价
使用 MATLAB 的性能函数 mae。该函数以平均绝对误差为准则来确定神经
网络的性能。
4、单个神经元的模拟
如图所示为有偏置的神经元模型,据其结构编制如下程序仿真其性能。
function [u y]=mnshjy(x)
w=[0.3 -0.5 0.4];
u=w*x;
if u>=1
y=logsig(u);
end
if u<1
y=0;
end
在上述程序中,我们去取权值向量为:
w
(0.3 0.5 0.4)
取阈值为:
1
激活函数取为 logsig(对数 S 形函数),可取为 purelin(线性函数),tansig
(正切 S 形函数),hardlim(硬限幅函数)等等。
5、感知机网络的模拟(采用 BP 算法)
构建一个两层的感知机网络,激活函数均选为 logsig(对数 S 形函数),编
制如下程序进行仿真。
tic
a1=randn(1,90);
a2=100*rand(1,90);
y10=2*a2+3;
y20=a2.^2+sin(a2);
y1=y10+a1;
y2=y20+a1;
p=[y1;y2];
pr=minmax(p);
goal=[ones(1,90);zeros(1,90)];
plot(a2,y1,'h',a2,y2,'o')
net=newff(pr,[3,2],{'logsig','logsig'});
net.trainParam.show = 10;
net.trainParam.lr = 0.05;
net.trainParam.goal = 1e-10;
net.trainParam.epochs = 50000;
net = train(net,p,goal);
y0=sim(net,p);
err0=mae(y0,goal);
toc
上述程序,采用前述方法生成 90 个实验数据,将这些数据用于神经网络的
训练,并记录程序运行时间,并对神经网络性能作出评价。
下面的程序可以生成 10 个新的实验数据,用来测试前面产生的神经网络的
性能。
b1=randn(1,10);
b2=100*rand(1,10);
y10=2*b2+3;
y20=b2.^2+sin(b2);
h1=y10+b1;
h2=y20+b1;
c=[h1;h2];
r=sim(net,c);
t=[ones(1,10);zeros(1,10)];
err=mae(r,t);
如下为仿真过程中得到的图像,包括每一次运算的误差,训练状态等。
程序执行时间为 0.558756 seconds
误差为 0.5000
用测试数据分析,实现了准确的分类。
将激活函数取为 tansig(正切 S 形函数)后,所得结果如下:
程序执行时间为 59.905634 seconds
6、竞争型网络的模拟
在前述前馈误差方向传播网络的基础上,采用竞争型(LVQ)网络。得到的
仿真结果如下:
程序执行时间为 14.410639
用测试数据分析,分类是有误差。
7、自组织映射(SOM)网络的模拟
构建一个两层的自组织映射网络,程序如下:
tic
a1=randn(1,90);
a2=100*rand(1,90);
y10=2*a2+3;
y20=a2.^2+sin(a2);
y1=y10+a1;
y2=y20+a1;
p=[y1;y2];
net=newsom([0 2;0 1],[3 5]);
plotsom(net.layers{1}.positions);
net.trainParam.epochs=10;
net=train(net,p);
plot(a2,y1,'h',a2,y2,'o');
hold on;
plotsom(net.iw{1,1},net.layers{1}.distances);
hold off;
figure;
net=init(net);
net.trainParam.epochs=20;
net=train(net,p);
plotsom(net.iw{1,1},net.layers{1}.distances);
toc
程序执行时间为 10.375700
四、实验结论
1、对于前馈反向传播网络,激活函数采用 logsig(对数 S 形函数),purelin
(线性函数),tansig(正切 S 形函数)均可以实现网络的训练,只是训
练需要的时间不同。
2、对于前馈反向传播网络和竞争型网络,在分类这个问题上,竞争型网络
的效果并不是很好。根据查到的资料,该网络更适合作聚类分析。