各位高手:帮忙看一下我的程序,关于BP网络的,想问一下如何才能使我的程序运行之后,误差是按指数规律下降。谢谢各位啦!!
%BP网络,根据计算过程编写
clear all
clc
close all
%======================参数设置============================================
SampleNum=100; %样本点数;
InputNum=1; %输入个数;
HiddenNum=10; %隐层单元个数;
OutputNum=1; %输出个数;
maxcount=200000; %最大训练次数;
Errgoal=0.001; %网络误差目标;
Lr=0.004; %学习率;
%=====================训练样本的获得========================================
SampleIn=8*rand(1,SampleNum)-4; %样本输入,为[-4,4]之间100个随机数;
SampleOut=1.1*(1-SampleIn+2*SampleIn.^2).*exp(-SampleIn.^2/2);
%绘制样本曲线
figure(1)
plot(SampleIn,SampleOut,'r+')
grid on
hold on
%=====================各层权值阈值初始化====================================
W1=0.2*rand(HiddenNum,InputNum)-0.1 ; %输入层和隐层之间的权值10×1,采用随机数初始化;
W2=0.2*rand(OutputNum,HiddenNum)-0.1; %隐层与输出层之间的权值1×10,采用随机数初始化;
V1=0.2*rand(HiddenNum,InputNum)-0.1 ; %输入层和隐层之间的阈值10×1,采用随机数初始化;
V2=0.2*rand(1,OutputNum)-0.1 ; %隐层与输出层之间的阈值1×1,采用随机数初始化;
W1EX=[W1,V1] %将隐层权值阈值整合10×2;
W2EX=[W2,V2] %将输出层权值阈值整合;
SampleInEX=[SampleIn',ones(SampleNum,1)]' ; %将样本扩展为和权值矩阵形式相同10×2
%其中第一列为输入具体值,第二列为1;
Error=[];
%======================训练过程============================================
for i=1:maxcount %结束条件:循环次数超过最大设定值;
%===========前向传播过程===================================================
net=W1EX*SampleInEX;
HiddenOut=logsig(net); %隐层节点输出10×100,激励函数为对数S型函数;
HiddenOutEX=[HiddenOut',ones(SampleNum,1)]';% 将隐层输出添加元素1并扩展为11×100
NetOut=W2EX*HiddenOutEX ; %W2EX为1×11,所以结果为1×100;
%计算误差,并判断是否达到误差要求;
Error0=SampleOut-NetOut ; %输出层误差;
SSE=sumsqr(Error0); %/i ; %输出误差平方和;
Error=[Error0 SSE] ; %记录训练误差;
if SSE
break;
end
%======================误差反向传播========================================
delta2=Error0 ; %输出层误差偏导;
delta1=W2'*delta2.*HiddenOut.*(1-HiddenOut) ; %隐层误差偏导;
%权值调节量;
DW2EX=delta2*HiddenOutEX' ; %输出层调整量;
DW1EX=delta1*SampleInEX' ; %隐层调整量;
%改变后的权值阈值;
W1EX=W1EX+Lr*DW1EX;
W2EX=W2EX+Lr*DW2EX;
end
%显示调整后的权值
W1Ex=W1EX
W2Ex=W2EX
%=======================网络测试===========================================
TestIn=-4:0.1:4;
TestSampleOut=1.1*(1-TestIn+2*TestIn.^2).*exp(-TestIn.^2/2);
Test_Num=81;
TestInEX=[TestIn',ones(Test_Num,1)]';
TestHiddenOut=logsig(W1EX*TestInEX) ;
TestHiddenOutEX=[TestHiddenOut',ones(Test_Num,1)]';
TestOut=W2EX*TestHiddenOutEX ;
plot(TestIn,TestOut,'b+-',TestIn,TestSampleOut,'g')
%==============误差曲线====================================================
figure(2)
hold on
[xx,num]=size(Error);
plot(1:num,Error)
title('误差曲线')
grid on