⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nnidbpma.m

📁 三层前向神经网络的权值训练方法 变步长的bp法
💻 M
字号:
% 自适应学习率的动量bp算法辨识nonlinearFn1.m
% (Gradient descent w/momentum & adaptive lr backpropagation) nnidbpma.m
%
% 
%songying, 2005-6-13

%  不会出现nnidbp.m中的仿真异常情况;也不会出现nnidbpa.m中拟合不好的情况

% 最终eta =   0.0153  0.0250  0.0292  0.0283   0.0304 
%   0.0339  0.0448 0.0271  0.0320 0.0247  0.0312 0.0310 0.0208 0.0308
%   0.0385  0.0327  0.0274 0.0479  0.0285 0.0380 0.0363  0.0361  0.0465
%   0.0219 0.0375 0.0371   0.0252  0.0366 0.0291  0.0192 0.0325 0.0283
%   0.0393 0.0358 0.0316 0.0281  0.0302  0.0466 0.0314 0.0245 0.0269 0.0297
%   0.0347 0.0267 0.0269 0.0233 0.0357 0.0354
% 
clear
clc
close all
eta=0.01;
alpha=0.5;
N=200;
un=2*rand(1,N)-1; 
pp=zeros(4,N);
y_1=0;
y_2=0;
u_1=0;
u_2=0;
for i=1:N   
    tt(i)=feval('nonlinearFn1',[y_1;y_2;u_1;u_2]);
    pp(:,i)=[tt(i);y_1;un(i);u_1];
    u_2=u_1;
    u_1=un(i);
    y_2=y_1;
    y_1=tt(i);
end
maxt=max(tt);
mint=min(tt);
for i=1:4
    PHI(i,:)=2*(pp(i,:)-min(pp(i,:)))/(max(pp(i,:))-min(pp(i,:)))-1;
end
Y=2*(tt-mint)/(maxt-mint)-1;
[inputs,N]=size(PHI);
[outputs,N]=size(Y);
hidden=5;
W1=rand(hidden,inputs)-0.5;
W2=rand(outputs,hidden)-0.5;
maxIter=4000;
PI_vector=zeros(maxIter,1);
outHidden=zeros(hidden,N);
delta1=outHidden;
outNN=zeros(outputs,N);
delta2=outNN;
%终止条件
critmin=0;
gradterm=1e-4;
paramterm=1e-3;
critterm=1e-7;
critdif=critterm+1;
%
dw1_old=0*W1;
dw2_old=0*W2;
tic
%开始训练
for iter=1:maxIter   
    %hidden-layer output
    outHidden=2./(1+exp(-2*W1*PHI))-1;    
    %output-layer output
    outNN=W2*outHidden;
    E=Y-outNN;
    SSE=sum(sum(E.*E));
    %backpropagation error
    delta2=E;
    E1=W2'*delta2;
    delta1=(1-outHidden.*outHidden).*E1;
    G2=delta2*outHidden';
    G1=delta1*PHI';
    %update weights
    dw2=alpha*dw2_old+(1-alpha)*eta*G2;
    dw1=alpha*dw1_old+(1-alpha)*eta*G1;
    W2=W2+dw2;
    W1=W1+dw1;
    %更新数据
    dw2_old=dw2;
    dw1_old=dw1;
    %******** updates for next iteration********
    PI=SSE/(2*N);
    PI_vector(iter)=PI;
    if iter>1
        critdif=abs(PI_vector(iter-1)-PI);
        if PI_vector(iter)<PI_vector(iter-1)
            eta=1.05*eta;
        elseif PI_vector(iter)>1.04*PI_vector(iter-1)
            eta=0.7*eta;
        else
            eta=eta;
        end
    end
    paramdif=eta*max(max(max(abs(G1))),max(max(abs(G2))));
    gradmax=paramdif/eta/N;
    
    if (PI<critmin|(critdif<critterm & gradmax<gradterm & paramdif<paramterm))
        break;
    end
end
% *********end of network training
toc
PI_vector=PI_vector(1:iter);
normY2=(outNN+1)*(maxt-mint)*0.5+mint;
normE=tt-normY2;
t=1:N;
subplot 211
plot(t,Y,'b',t,outNN,'r');
title('归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,E)
title('归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
%
figure
subplot 211
plot(t,tt,'b',t,normY2,'r');
title('未归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,normE)
title('未归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
figure
semilogy(PI_vector);  % y axis is logarithmic (base 10)
title('Criterion evaluated after each iteration');
xlabel('Iteration (epoch)');
ylabel('Criterion');
grid;
%test nn
un=2*rand(1,N)-1;  %phi样本输入数据,如果仅用rand(4,N),效果不如rand(4,N)-0.5好
pp=zeros(4,N);
y_2=0;
y_1=0;
u_1=0;
u_2=0;
for i=1:N   
    tt(i)=feval('nonlinearFn1',[y_1;y_2;u_1;u_2]);
    pp(:,i)=[tt(i);y_1;un(i);u_1];
    u_2=u_1;
    u_1=un(i);
    y_2=y_1;
    y_1=tt(i);
end
maxt=max(tt);
mint=min(tt);
for i=1:4
    PHI2(i,:)=2*(pp(i,:)-min(pp(i,:)))/(max(pp(i,:))-min(pp(i,:)))-1;
end
Y2=2*(tt-mint)/(maxt-mint)-1;
yn=W2*(1-2./(1+exp(2*W1*PHI2)));
normYn=(yn+1)*(maxt-mint)*0.5+mint;
 En=Y2-yn;
 normEn=tt-normYn;
 %
 figure
 subplot 211
 plot(t,Y2,'b',t,yn,'r');
title('归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,En)
title('归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
%
figure
subplot 211
 plot(t,tt,'b',t,normYn,'r'); 
title('未归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,normEn)
title('未归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
eta

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -