主题:求助!BP神经神经网络问题
各位高手好!我现在想通过BP网络实现一个双输入单输出的函数逼近,但是总体误差过大,不能满足要求。请各位高手帮忙看看。
lr=0.05;err=0.001;%lr是学习速率,err为误差期望最小值
max_epoch=1000;a=0.9;%max_epoch为训练最大步数,a为惯性系数
Oi=0;Ok=0;%置隐含层和输出层初始值为0;
%提供32组训练集和目标值(两输入一输出)
%激活函数取g(x)=1/(1+exp(-x))
X=[0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,
0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8;
0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,
2.2,2.2,2.2,2.2,2.2,2.2,2.2,2.2,3.2,3.2,3.2,3.2,3.2,3.2,3.2,3.2];
T1=[16,16,16,12,12,8,4,0,16,12,8,8,8,4,0,0,16,16,16,
12,8,8,4,0,16,16,16,12,12,8,4,0];
%我想激活函数不能大于1,最后目标值不能大于1。(我可能理解有问题,请您纠正)
T=T1/16;
[M,N]=size(X);q=15;[L,N]=size(T);%M为输入节点j的数量;q为隐含层节点i的数量;L为输出层节点k的数量
wij=rand(q,M);
wki=rand(L,q);
wij0=zeros(size(wij));wki0=zeros(size(wki));
for epoch=1:max_epoch
% 计算隐含层各神经元输出
NETi=wij*X;
for j=1:N
for i=1:q
Oi(i,j)=1/(1+exp(-NETi(i,j)));
end
end
%计算输出层各神经元输出
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k,i)));
end
end
%计算误差函数
E=((T-Ok)*(T-Ok)')/2;
if(E<err)break;end
% 调整输出层加权系数
deltak=Ok.*(1-Ok).*(T-Ok);
w=wki;
wki=wki+lr*deltak*Oi';
wki0=w;
% 调整隐含层加权系数
deltai=Oi.*(1-Oi).*(deltak'*wki)';
w=wij;
wij=wij+lr*deltai*X';
wij0=w;
end
E%显示最后误差
epoch%显示计算次数
X1=X;
%计算各神经元输出
NETi=wij*X1;
for j=1:N
for i=1:q
Oi(i,j)=1/(1+exp(-NETi(i,j)));
end
end
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k,i)));
end
end
Ok*16 %显示输出结果
lr=0.05;err=0.001;%lr是学习速率,err为误差期望最小值
max_epoch=1000;a=0.9;%max_epoch为训练最大步数,a为惯性系数
Oi=0;Ok=0;%置隐含层和输出层初始值为0;
%提供32组训练集和目标值(两输入一输出)
%激活函数取g(x)=1/(1+exp(-x))
X=[0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,
0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8,0.8,1.2,1.6,2.4,3.2,3.6,4.2,4.8;
0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,
2.2,2.2,2.2,2.2,2.2,2.2,2.2,2.2,3.2,3.2,3.2,3.2,3.2,3.2,3.2,3.2];
T1=[16,16,16,12,12,8,4,0,16,12,8,8,8,4,0,0,16,16,16,
12,8,8,4,0,16,16,16,12,12,8,4,0];
%我想激活函数不能大于1,最后目标值不能大于1。(我可能理解有问题,请您纠正)
T=T1/16;
[M,N]=size(X);q=15;[L,N]=size(T);%M为输入节点j的数量;q为隐含层节点i的数量;L为输出层节点k的数量
wij=rand(q,M);
wki=rand(L,q);
wij0=zeros(size(wij));wki0=zeros(size(wki));
for epoch=1:max_epoch
% 计算隐含层各神经元输出
NETi=wij*X;
for j=1:N
for i=1:q
Oi(i,j)=1/(1+exp(-NETi(i,j)));
end
end
%计算输出层各神经元输出
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k,i)));
end
end
%计算误差函数
E=((T-Ok)*(T-Ok)')/2;
if(E<err)break;end
% 调整输出层加权系数
deltak=Ok.*(1-Ok).*(T-Ok);
w=wki;
wki=wki+lr*deltak*Oi';
wki0=w;
% 调整隐含层加权系数
deltai=Oi.*(1-Oi).*(deltak'*wki)';
w=wij;
wij=wij+lr*deltai*X';
wij0=w;
end
E%显示最后误差
epoch%显示计算次数
X1=X;
%计算各神经元输出
NETi=wij*X1;
for j=1:N
for i=1:q
Oi(i,j)=1/(1+exp(-NETi(i,j)));
end
end
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k,i)));
end
end
Ok*16 %显示输出结果