马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
大家如果有时间,帮我看看程序,小波神经网络采用10组样本进行训练,训练好之后,用该网络识别新的样本,不管样本是什么内容,最终输出的都是1。我怀疑我这个小波网络训练完之后保存的阈值和权值参数,是最后训练的那组样本所对应的阈值和权值,所以再用该网络识别其它样本,总是输出1。
各位帮我看看到底是哪里出了问题,我研究了好长时间也没发现问题在哪:'( ,拜托各位了:handshake
%小波神经网络程序
clc
clear
%step 1=========================
%定义输入样本;
x=[0.5110 0.2271 0.0558 0.1369 0.0004 0.0025 0.0577 0.0087;
0.2322 0.3205 0.0528 0.2471 0.0002 0.0043 0.1276 0.0153;
0.7620 0.1511 0.0067 0.0674 0.0003 0.0013 0.0082 0.0030;
0.4412 0.2151 0.1118 0.1280 0.0008 0.0024 0.0930 0.0077;
0.3203 0.1544 0.1779 0.1999 0.0043 0.0061 0.1224 0.0146;
0.5220 0.3279 0.0188 0.0992 0.0001 0.0014 0.0251 0.0055;
0.4858 0.2624 0.0415 0.1666 0.0002 0.0023 0.0333 0.0080;
0.2683 0.4707 0.0423 0.1546 0.0003 0.0037 0.0541 0.0060;
0.2698 0.2268 0.0752 0.3603 0.0003 0.0063 0.0352 0.0261;
0.1283 0.4199 0.0181 0.3887 0.0007 0.0031 0.0300 0.0112]';%样本集
targ=[1 1 0 1 1 0 0 0 0 1];%目标
eta=0.02;%学习率取得适当可以加快误差的减小
aerfa=0.935;%动量因子
max_perf_inc=1.04;
lr_dec=0.7;
lr_inc=1.05;c=0.5;
%初始化连接权wjh(输出层和隐层的连接权);whi(隐层和输出层的连接权);
%假设小波函数节点数为:H个;样本数为P;
%输出节点数为:J个;输入节点数为:I个;
I=8;%输入节点数
J=1;%输出节点数
H=2*I+1;%隐层节点数
P=10;%样本数
%初始化小波参数
b=rand(H,1);%平移因子
a=rand(H,1);%伸缩因子
%初始化权系数;
whi=rand(I,H);%输入层与隐层权值
wjh=rand(H,J);%隐层与输出层权值
%阈值初始化;
b1=rand(H,1);%隐层各单元的输出阈值
b2=rand(J,1);%输出层各单元的输出阈值
p=0;
%保存的误差;
Err_NetOut=[];
% flag=1;count=0;
%进入小波神经网络的运行过程
for k=1:P
flag(k)=1;count(k)=0;
while flag(k)>0
flag(k)=0;
count(k)=count(k)+1;
%step 2=================================
xhp1(k)=0;
%%%%%%%%求隐层的输入值
for h=1:H
for i=1:I
xhp1(k)=xhp1(k)+whi(i,h)*x(i,k);%求权值和输入值的乘积和
end
ixhp(h,1)=xhp1(k)+b1(h,1);%求隐层的输入值
xhp1(k)=0;
end
%%%%%%%%求隐层的输出值
for h=1:H
oxhp(h,1)=fai((ixhp(h,1)-b(h,1))/a(h,1));%将小波函数作为隐层的传递函数求隐层的输出值
end
%step 3====================================
%%%%%%%%求输出层的输入值
ixjp1(k)=0;
for j=1:J
for h=1:H
ixjp1(k)=ixjp1(k)+wjh(h,j)*oxhp(h,1);
end
ixjp(j,1)=ixjp1(k)+b2(j,1);
ixjp1(k)=0;
end
%%%%%%%%求输出层的输出值
for i=1:J
oxjp(k)=fnn(ixjp(i,1));
% oxjp(i,k)=fnn(ixjp(i));
end
%step 6==保存每次误差=====
wuchayy=1/2*sumsqr(oxjp(k)-targ(k));%求输出值与目标值差值的平方和
Err_NetOut=[Err_NetOut wuchayy];%保存每次的误差;
%调节学习率eta==================================================
if count(k)==1
eta=eta;
else
if Err_NetOut(count(k))/Err_NetOut(count(k)-1)>max_perf_inc
eta=eta*lr_dec;
else eta=eta*lr_inc;
end
end
%求detaj ,detab2==================================
%%%%%%%%%%%%%求网络参数的梯度值
for j=1:J
detaj(j)=-(oxjp(j,k)-targ(j,k))*oxjp(j,k)*(1-oxjp(j,k));%在误差函数中对输出层的输入值求偏导
end
for j=1:J
for h=1:H
detawjh(h,j)=eta*detaj(j)*oxhp(h,1);%误差函数对隐层和输出层之间的权值的偏导
end
end
detab2=eta*detaj;%误差函数对输出层的阈值的偏导
%求detah, detawhi detab1 detab detaa;========================
sum=0;
for h=1:H
for j=1:J
sum=detaj(j,1)*wjh(h,j)*diffai((ixhp(h)-b(h))/a(h))/a(h)+sum;%difmallet()函数是mallet()函数的导数
end
detah(h,1)=sum;%求误差函数对隐层输入值的偏导
sum=0;
end
for h=1:H
for i=1:I
detawhi(i,h)=eta*detah(h,1)*x(i,k);%求误差函数对输入层和隐层之间的权值的偏导
end
end
detab1=eta*detah;
detab=-eta*detah;%求误差函数对小波函数中的平移因子的偏导
for h=1:H
detaa(h,1)=-eta*detah(h,1)*((ixhp(h,1)-b(h,1))/a(h,1));
end
%引入动量因子aerfa,修正各个系数==========================================
wjh=wjh+(1+aerfa)*detawjh;
whi=whi+(1+aerfa)*detawhi;
a=a+(1+aerfa)*detaa;
b=b+(1+aerfa)*detab;
b1=b1+(1+aerfa)*detab1;
b2=b2+(1+aerfa)*detab2;
%======================================================
%引入修正算法!!
%判断所有的样本是否计算完==================================
if Err_NetOut(end)>0.00005
flag(k)=flag(k)+1;
else
% figure;
% plot(Err_NetOut);
% title('误差曲线');
% disp('目标达到');
disp(oxjp(k));
disp(count(k));
end
% end
if count(k)>2000
figure;
plot(Err_NetOut);
title('误差曲线');
disp('目标未达到');
disp(oxjp(k));
disp(count(k));
break;
end
end
end
save net;
disp('=================');
%%%%%%%%%%%%%利用训练好的网络进行识别
P_test=[0.7166 0.1586 0.0108 0.0956 0.0003 0.0013 0.0095 0.0073;
0.1438 0.0472 0.2769 0.0298 0.0019 0.0054 0.4564 0.0387;
0.3554 0.2095 0.0742 0.2180 0.0022 0.0055 0.1225 0.0126;
0.4503 0.0910 0.1263 0.0424 0.0030 0.0036 0.2707 0.0127;
0.7163 0.1659 0.0137 0.0854 0.0003 0.0016 0.0115 0.0053;
0.7815 0.1248 0.0110 0.0648 0.0001 0.0009 0.0130 0.0041;
0.6168 0.1668 0.0179 0.1761 0.0004 0.0030 0.0109 0.0082;
0.5499 0.0980 0.1169 0.0486 0.0017 0.0046 0.1711 0.0092]';
T_test=[0;1;1;1;0;0;0;1]';
I=8;%输入节点数
J=1;%输出节点数
H=2*I+1;%隐层节点数
Err_NetOut1=[];
PP=8;
for kk=1:PP
flag(kk)=1;count(kk)=0;
while flag(kk)>0
flag(kk)=0;
count(kk)=count(kk)+1;
%step 2=================================
xhp12(kk)=0;
%%%%%%%%求隐层的输入值
for h=1:H
for i=1:I
xhp12(kk)=xhp12(kk)+whi(i,h)*P_test(i,kk);%求权值和输入值的乘积和
end
ixhp2(h,1)=xhp12(kk)+b1(h,1);%求隐层的输入值
xhp12(kk)=0;
end
%%%%%%%%求隐层的输出值
for h=1:H
oxhp2(h,1)=fai((ixhp2(h,1)-b(h,1))/a(h,1));%将小波函数作为隐层的传递函数求隐层的输出值
end
%step 3====================================
%%%%%%%%求输出层的输入值
ixjp12(kk)=0;
for j=1:J
for h=1:H
ixjp12(kk)=ixjp12(kk)+wjh(h,j)*oxhp2(h,1);
end
ixjp2(j,1)=ixjp12(kk)+b2(j,1);
ixjp12(kk)=0;
end
%%%%%%%%求输出层的输出值
for i=1:J
oxjp2(kk)=fnn(ixjp2(i,1));
end
%step 6==保存每次误差=====
wuchayy1=1/2*sumsqr(oxjp2(kk)-T_test(kk));%求输出值与目标值差值的平方和
Err_NetOut1=[Err_NetOut1 wuchayy1];%保存每次的误差;
if Err_NetOut1(end)>0.005
flag(kk)=flag(kk)+1;
else
disp('目标达到');
disp(oxjp2(kk));
plot(kk,T_test(kk),'+',kk,oxjp2(kk),'o');
hold on
if kk==PP
figure;
plot(Err_NetOut1);
title('误差曲线');
end
end
if count(kk)>2000
disp('目标未达到');
disp(oxjp2(kk));
disp(count(kk));
break;
end
end
end |