声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 961|回复: 1

[编程技巧] 发一个 BP网络的 算法 大家讨论一下

[复制链接]
发表于 2008-7-20 16:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

HiddenUnitNum = 5;
[InDim,SamNum] = size(SamIn);
[OutDim,SamNum] = 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=[W1 B1];
W2Ex=[W2 B2];
w1=0; %
w2=0;
alpha=0.7; % I_H权值的动量因子
beta=0.7; %H_O权值的动量因子

SamInEx=[SamIn' ones(SamNum,1)]'; % 扩展输入矩阵
ErrHistory=[];

for Epoch=1:MaxEpochs
    HiddenOut=logsig(W1Ex*SamInEx); %隐层输出
    HiddenOutEx=[HiddenOut' ones(SamNum,1)]';
    NetworkOut=logsig(W2Ex*HiddenOutEx); % 输出层输出
    Error=SamOut-NetworkOut; % 误差
    SSE=(1/(2*SamNum))*sumsqr(Error); % sumsqr(): Sum squared elements of a matrix
    ErrHistory=[ErrHistory SSE];
    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);
    [xx,Num]=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算法,希望能学习以下
回复
分享到:

使用道具 举报

 楼主| 发表于 2008-7-21 09:37 | 显示全部楼层
自己顶,这个算法还是很不错的 我感觉:)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-29 00:01 , Processed in 0.050587 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表