Matlab实现简单BP神经网络

实验目的

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

猜你喜欢

转载自blog.csdn.net/zjccoder/article/details/40713147