数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2315|回复: 1

两隐层BP算法[求助]

[复制链接]
发表于 2003-12-8 06:19:31 | 显示全部楼层 |阅读模式
总是调试不过,请指教。






%  BP Algorithm with 2 hidden layers
%======================================================================
clear               %清除工作空间所有变量及函数
%  打开数据文件读入网络参数及训练样本
filename=input('Training Set File Name:','s');
fp=fopen(filename,'rt');
if  fp==-1
    error('Error when opening training set file!');
end
%读出网络结构参数并初始化权系
R  =fscanf(fp,'%d',1);%输入层神经元数
S1 =fscanf(fp,'%d',1);%第一隐层神经元数
F1 =fscanf(fp,'%s',1);%第一隐层神经元传递函数类型
DF1=getdelta(F1);     %第一隐层神经元传递函数导函数
W1 =rands(S1,R)*0.5;  %第一层权矩阵(S1*R)
B1 =rands(S1,1)*0.5;  %第一层偏置矩阵(S1*1)
dW1=W1*0;             %第一层权矩阵增量(S1*R)
dB1=B1*0;             %第一层偏置矩阵增量(S1*1)
S2 =fscanf(fp,'%d',1);%第二隐层神经元数
F2 =fscanf(fp,'%s',1);%第二隐层神经元传递函数类型
DF2=getdelta(F2);     %第二隐层神经元传递函数导函数
W2 =rands(S2,S1)*0.5; %第二层权矩阵(S2*S1)
B2 =rands(S2,1)*0.5;  %第二层偏置矩阵(S2*1)
dW2=W2*0;             %第二层权矩阵增量(S2*S1)
dB2=B2*0;             %第二层偏置矩阵增量(S2*S1)
S3 =fscanf(fp,'%d',1);%第三层神经元数
F3 =fscanf(fp,'%s',1);%第三层神经元传递函数类型
DF3=getdelta(F3);     %第三层神经元传递函数导函数
W3 =rands(S3*S2)*0.5; %第三层权矩阵(S3*S2)
B2 =rands(S3,1)*0.5;  %第三层偏置矩阵(S3*1)
dW3=W3*0;             %第三层权矩阵增量(S3*S2)
dB3=B3*0;             %第三层偏置矩阵增量(S3*1)
MC =0;
%网络训练所用参数
disp_freq   =fscanf(fp,'%f',1);  %网络状态输出频率
max_epoch   =fscanf(fp,'%f',1);  %最大训练次数
err_goal    =fscanf(fp,'%f',2);  %误差目标
lr          =fscanf(fp,'%f',1);  %初始学习率,可取lr=0.01~0.5
lr_inc      =fscanf(fp,'%f',1);  %学习率增长系数,可取lr_inc=1.04
lr_dec      =fscanf(fp,'%f',1);  %学习率减小系数,可取lr_dec=0.75
err_ratio   =fscanf(fp,'%f',1);  %误差增大比率上限,可取err_ratio=1.05
mc          =fscanf(fp,'%f',1);  %动量项常数,可取mc=0.9~0.98
%读入训练样本
Q  =fscanf(fp,'%d',1);  %训练样本数
PO =zeros(R,Q);         %输入模式矩阵
TO =zeros(S3,Q);        %输出模式矩阵
for i=1
    for j=1:R,  P0(j,i)=fscanf(fp,'%f',1);end
    for j=1:S3, T0(j,i)=fscanf(fp,'%f',1);end
end
fclose (fp);
%求输入输出模式各分量的平均值及标准差并作相应处理
PMEANO =mean(P0');   TMEANO=mean(T0');
PSTDO  =std(P0');    TSTDO =std(T0');
PMEAN  =(ones(Q,1)*PMEAN0)';
TMEAN  =(ones(Q,1)*TMEAN0)';
PSTD   =(ones(Q,1)*PSTD0)';
TSTD   =(ones(Q,1)*TSTD0)';
P = (P0-PMEAN)./PSTD;   T=(T0-TMEAN)./TSTD;
%读入测试集样本数据
filename =input('Validation Set File Name:','s');
fp       =fopen(filename,'rt');
if fp==-1
    error('Error when opening validation data file!')
end
QTEST  =fscanf(fp,'%d',1);    %测试样本数
P0TEST =zeros(R,QTEST);       %测试集原始输入
T0TEST =zeros(S3,QTEST);      %测试集期望输出
for i=1TEST
    for j=1:R,   P0TEST(j,i)=fscanf(fp,'%f',1);end
    for j=1:S3,  T0TEST(j,i)=fscanf(fp,'%f',1);end
end
fclose (fp);
%对测试样本做同样预处理
PMEANTEST  =(ones(QTEST,1)*PMEAN0)';
TMEANTEST  =(ones(QTEST,1)*TMEAN0)';
PSTDTEST   =(ones(QTEST,1)*PSTD0)';
TSTDTEST   =(ones(QTEST,1)*TSTD0)';
PTEST=(P0TEST-PMEANTEST)./PSTDTEST;
TTEST=(T0TEST-TMEANTEST)./TSTDTEST;
%训练开始
disp('Trainging begins...');
%正向计算阶段
A1 =feval(F1,W1*P,B1);    %第一层输出
A2 =feval(F2,W2*A1,B2);   %第二层输出
A3 =feval(F3,W3*A2,B3);   %输出层输出
E  =T-A3;                 %误差
SSE=sumsqr(E);            %误差平方和
A1TEST =feval(F1,W1*PTEST,B1);
A2TEST =feval(F2,W2*A1TEST,B2);
A3TEST =feval(F3,W3*A2TEST,B3);
ETEST  =sumsqr(ETEST);
TR     =[SSE;lr];         %每次学习后的SSE和学习率
TRTEST =[SSETEST];
%反向传播阶段
D3 =feval(DF3,A3,E);      %第三层误差信号
D2 =feval(DF2,A2,D3,W3);  %第二层误差信号
D1 =feval(DF1,A1,D2,W2);  %第一层误差信号
for epoch=1:max_epoch     %检验误差是否达到目标,是则退出,否则继续训练
    if SSE<err_goal
        epoch=epoch-1;break;
    end
    %学习阶段:计算各层权矩阵的增量
    [dW1,dB1] = learnbpm(P,D1,lr,MC,dW1,dB1);
    [dW2,dB2] = learnbpm(A1,D2,lr,MC,dW2,dB2);
    [dW3,dB3] = learnbpm(A2,D3,lr,MC,dW3,dB3);
    MC =mc;
    TW1=W1+dW1;TB1=B1+dB1;
    TW2=W2+dW2;TB2=B2+dB2:
    TW3=W3+dW3;TB3=B3+dB3;
    %正向计算并将结果暂存以考察此次修改能否减低误差
    TA1=feval(F1,TW1*P,TB1);
    TA2=feval(F2,TW2*TA1,TB2);
    TA3=feval(F3,TW3*TA2,TB3);
    TE=T-TA3;        TSSE=sumsqr(TE);
    A1TEST=feval(F1,TW1*PTEST,TB1);
    A2TEST=feval(F2,TW2*A1TEST,TB2);
    A3TEST=feval(F3,TW3*A2TEST,TB3);
    ETEST=TTEST-A3TEST;     SSETEST=sumsqr(ETEST);
    %动量项和自适应学习率阶段
    if TSSE>SSE*err_ratio
        lr=lr*lr_dec; MC=0;
    else
     if TSSE<SSE,lr=lr*lr_inc;end
      W1=TW1;W2=TW2;W3=TW3;
      B1=TB1;B2=TB2;B3=TB3;
      A1=TA1;A2=TA2;A3=TA3;
      E=TE;SSE=TSSE;
      TR=[TR[SSE;lr]];
      TRTEST=[TRTEST[SSETEST]];
      %反向传播阶段
      D3=feval(DF3,A3,E);
      D2=feval(DF2,A2,D3,W3);
      D1=feval(DF1,A1,D2,W2);
    end
    %现实训练轮次及误差
    if (rem(epoch,disp_freq)==0)
       fpringf('/nEpoch=%5.0f SSE=%8.5f',epoch,SSE);
    end
end
%现实网络最终状态及计算值与期望值之间的相对误差
A1=feval(F1,W1*P,B1);
A2=feval(F2,W2*A1,B2);
A3=feval(F3,W3*A2,B2);
SSE=sumsqr(T-A3);
fprintf('\n\nFINAL NETWORK VALUES;\n')
W1
B1
W2
B2
W3
B3
A3
T
E=T-A3
A30=A3.*TSTD+TMEAN;
RES=[P0'T0'A30'((A30-T0)./T0*100)']
%输出测试集相应结果
A1TEST=feval(F1,W1*PTEST,B1);
A2TEST=feval(F2,W2*A1TEST,B2);
A3TEST=feval(F3,W3*A2TEST,B3);
A30TEST=A3TEST.*TSTDTEST+TMEANTEST;
RES=[P0TEST'T0TEST'A30TEST'((A30TEST-T0TEST)./T0TEST*100)']
%显示训练,测试误差曲线
clf reset
ploterr(TR(1,);
hold on
pause
ploterr(TRTEST);
%end

发表于 2003-12-8 07:14:59 | 显示全部楼层
首先,有没有必要自己实现
Matlab中就自带了一个很漂亮的神经网络的实现
其次,最好付上数据文件
不然没法调试啊
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-5-10 10:11 , Processed in 0.051862 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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