BP神经网络收敛的问题
各位高手好!我现在想通过BP网络实现一个双输入单输出(一共32组数据)的函数逼近,但是总体误差过大,不能满足要求。请各位高手帮忙看看。还有不知道为什么当只有几组数据时BP神经网络工具箱函数好用,但当32组数据时就总是显示这些函数是obsolete function?
lr=0.05;err=0.001;%lr是学习速率,err为误差期望最小值
max_epoch=10000;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,7,6,4,0,0,16,16,16,12,8,8,4,0,16,16,16,12,12,8,4,0];
%我想激活函数不能大于1,最后目标值不能大于1。(我可能理解有问题,请您纠正)
T=T1/20+0.1;
[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)+0.5)/1.4));
end
end
%计算输出层各神经元输出
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp((-NETk(k,i)+0.5)/1.4));
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)+0.5)/1.4));
end
end
NETk=wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp((-NETk(k,i)+0.5)/1.4));
end
end
A=(Ok-0.1)*20 %显示输出结果
B=T1-A
plot(A);
hold on;
plot(T1,'r');