总是调试不过,请指教。
% 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
|