|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
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算法,希望能学习以下 |
|