matlab避免误差传播方法,请教 ,Matlab的BP网络训练误差的问题

各位高手:帮忙看一下我的程序,关于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值