yongzhen913 发表于 2008-7-20 16:28

发一个 BP网络的 算法 大家讨论一下

clear
clc
tic
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
P =;
T = ;
%%%%%%%%%%%%%%%%%%%%%%%%%%
%P=0:0.025*pi:2*pi;                     %初始化!
%T=1+sin(P);
SamIn=P;
SamOut=T;

HiddenUnitNum = 5;
= size(SamIn);
= size(SamOut);


MaxEpochs=10000;
lr=0.5;
E0=0.001;
TotalEpochs = 0;


W1=rand(HiddenUnitNum,InDim)-0.5;
B1=rand(HiddenUnitNum,1)-0.5;
W2=rand(OutDim,HiddenUnitNum)-0.5;
B2=rand(OutDim,1)-0.5;
W1Ex=;
W2Ex=;
w1=0; %
w2=0;
alpha=0.7; % I_H权值的动量因子
beta=0.7; %H_O权值的动量因子

SamInEx='; % 扩展输入矩阵
ErrHistory=[];

for Epoch=1:MaxEpochs
    HiddenOut=logsig(W1Ex*SamInEx); %隐层输出
    HiddenOutEx=';
    NetworkOut=logsig(W2Ex*HiddenOutEx); % 输出层输出
    Error=SamOut-NetworkOut; % 误差
    SSE=(1/(2*SamNum))*sumsqr(Error); % sumsqr(): Sum squared elements of a matrix
    ErrHistory=;
    if SSE<E0
      break
    end

    %Delta2=Error; %%
    Delta2 = Error.*NetworkOut.*(1-NetworkOut); %%隐层神经元的误差信号
    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); %%
    dW2Ex=Delta2*HiddenOutEx'; % 调整量
    dW1Ex=Delta1*SamInEx';
    % %%%%%%%%%%%%%标准BP算法%%%%%%%%%%%
    %W1Ex=W1Ex+lr*dW1Ex;
    %W2Ex=W2Ex+lr*dW2Ex;
    %%%%%%%%%%%%%%%%%%%%加入动量项的BP算法%%%%%%%%%%%
    a=W1Ex;
    b=W2Ex;
    W1Ex=W1Ex+lr*dW1Ex+alpha*w1;
    W2Ex=W2Ex+lr*dW2Ex+beta*w2;
    w1=W1Ex-a;
    w2=W2Ex-b;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % W2=W2Ex(:,1:HiddenUnitNum);
    %%W1=W1Ex(:,1:InDim);
    =size(ErrHistory);
plot(1:Num,ErrHistory,'k--');
title('训练误差')
end


% 输出结果
W1=W1Ex(:,1:InDim)
B1=W1Ex(:,InDim+1)
W2=W2Ex(:,1:HiddenUnitNum)
B2=W2Ex(:,1+HiddenUnitNum)

NetworkOut


toc

%%%%%%%%%%%%%%%%%%%%%%%%%%
上述BP代码 在计算异或问题方面 能够达到很好的效果,但是在函数拟和上(sin())训练不收敛?
有高手能够看看 代码内部有问题吗?
%%上面算法中 隐层神经元的误差信号
(1)%Delta2=Error; %%
(2)Delta2 = Error.*NetworkOut.*(1-NetworkOut); %%隐层神经元的误差信号
常规BP算法应当是第(2)种方法,实现函数拟和效果不好
但是地(1)种方法实现函数拟和还可以,异或问题不能结决

呵呵请大家指教了。。
另外那位仁兄能有 BP网络的 LM算法,希望能学习以下

yongzhen913 发表于 2008-7-21 09:37

自己顶,这个算法还是很不错的 我感觉:)
页: [1]
查看完整版本: 发一个 BP网络的 算法 大家讨论一下