实验目的
1)掌握BP神经网络算法的基本设计实现并拟合函数。
2)熟练掌握误差反馈对网络权重修正的机理;
3) 分析实验结果来验证理解BP神经网络算法中学习率参数的重要性。
实验内容与步骤
1、BP神经网络结构设计
典型的BP神经网络为三层结构:输入层、隐含层和输出层。
输入层接受算法的输入,在本实例中对应为x。输入层节点的个数应当和x的维数对应,在本实例中,输入x为标量,因此输入层节点个数为1。
隐含层结点个数可以自行设定,在本实例中建议为6个。
输出层结点个数应当和输出y的维数对应,在本实例中,输出y为标量,因此输出层节点个数为1。
2、算法基本思路
给定组样本;;;。这里为一维输入矢量,为一维期望输出矢量。假设矢量为网络的实际输出。
则训练过程为:
1) 确定神经网络结构为1-6-1型,选作为最大容许误差,并给出隐层到输出层的权矩阵,输入层到隐层的权矩阵,将其初始化为某一小的随机权矩阵。
2) 依次输入样本,计算网络的实际输出。
3) 计算误差,。
4) 计算各层权值的变化量
5) 调节权值
6) 若,则,转2),否则转7)。
7) 若,结束,否则,,转2)进入下一轮的计算,若直到规定的次数时还没有使,则强行退出,终止程序。
详细步骤
1、打开Matlab
2、选择工作目录,此处我选的桌面
3、点击左上角新建一个Script
4、把下面代码复制进去
for i=1:20 %样本个数
xx(i)=2*pi*(i-1)/20;
d(i)=0.5*(1+cos(xx(i)));
end
n=length(xx);%样本个数
p=6; %隐层个数
w=rand(p,2);
wk=rand(1,p+1);
max_epoch=10000;%最大训练次数
error_goal=0.002;%均方误差
q=0.09;%学习速率
a(p+1)=-1;
%training
%此训练网络采取1-6-1的形式,即一个输入,6个隐层,1个输出
for epoch=1:max_epoch
e=0;
for i=1:n %样本个数
x=[xx(i);-1];
neto=0;
for j=1:p
neti(j)=w(j,1)*x(1)+w(j,2)*x(2);
a(j)=1/(1+exp(-neti(j)));
%隐层的激活函数采取s函数,f(x)=1/(1+exp(-x))
neto=neto+wk(j)*a(j);
end
neto=neto+wk(p+1)*(-1);
y(i)=neto; %输出层的激活函数采取线性函数,f(x)=x
de=(1/2)*(d(i)-y(i))*(d(i)-y(i));
e=de+e;
dwk=q*(d(i)-y(i))*a;
for k=1:p
dw(k,1:2)=q*(d(i)-y(i))*wk(k)*a(k)*(1-a(k))*x;
end
wk=wk+dwk; %从隐层到输出层权值的更新
w=w+dw; %从输入层到隐层的权值的更新
end
error(epoch)=e;
m(epoch)=epoch;
if(e<error_goal)
break;
elseif(epoch==max_epoch)
disp('在目前的迭代次数内不能逼近所给函数,请加大迭代次数')
end
end
%simulation
for i=1:n %样本个数
x=[xx(i);-1];
neto=0;
for j=1:p
neti(j)=w(j,1)*x(1)+w(j,2)*x(2);
a(j)=1/(1+exp(-neti(j)));
neto=neto+wk(j)*a(j);
end
neto=neto+wk(p+1)*(-1);
y(i)=neto; %线性函数
end
%plot
figure(1)
plot(m,error)
xlabel('迭代次数')
ylabel('均方误差')
title('BP算法的学习曲线')
figure(2)
plot(xx,d)
hold on
plot(xx,y,'r')
legend('蓝线是目标曲线','红线是逼近曲线')
5、保存为BP.m
7、点击运行
8、结果如图
9、学习率与迭代次数分析:
代码中,学习率:
q=0.09;%学习速率
迭代次数:
max_epoch=10000;%最大训练次数
END