主题:熟悉 bp神经网络 编程的进来看一下
我用matlab(2008b)做bp神经网络作业,从[0,2*pi]取九个样本点,期望输出是样本点的正弦值。在训练的过程中,出现了好多NaN,不知道是什么问题,求高手帮忙。具体情况如下:
********************************************************************
%利用一个单输入单输出的两层bp网络训练一个输入为0到2*pi的9个样本点,期望的输出均为所取样本正弦函数值的神经网络系统,隐含层激活函数取Sigmoid函数,输出层取线性函数。(一个输入层,一个有4个神经元的隐含层,一个输出层)
%bp网络的第一阶段学习期(训练加权系数wki,wij)
%初始化
lr=0.5;%学习效率
err_goal=0.001;%期望误差最小值
max_epoch=10000;%训练的最大次数
a=0.7;%惯性系数
Oi=0;%置隐含层和输出层个神经元输出初值为零
Ok=0;
%提供9组训练集和目标值(1输入,1输出)
X=linspace(0,2*pi,9);
T=sin(X);
%初始化wki,wij(M为输入节点j的数量;q为隐含层节点i的数量;L为输出节点k的数量)
[M,N]=size(X);
q=4;
[L,N]=size(T);%N为训练集对数量
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)=NETk(k,i);
end
end
%计算输出误差函数
E=sum((T-Ok).^2)/2;
if(E<err_goal)break;end
%调整输出层加权系数
deltak=Ok.*(1-Ok).*(T-Ok);
w=wki;
wki=wki+lr*deltak*Oi'+a*(wki-wki0);
wki0=w;
%调整隐含层加权系数
deltai=Oi.*(1-Oi).*(deltak'*wki)';
w=wij;
wij=wij+lr*deltai*X'+a*(wij-wij0);
wij0=w;
end
epoch%显示计算次数
plot(E,epoch)%显示误差随训练次数的走向
********************************************************************
遇到问题就是:wij,wki,wij0,wki0,deltak,NETk,Ok,E。全都是NaN,不知道怎么回事,应该怎么处理。还有,最后显示的误差曲线图是空白的。
希望高手帮忙解决问题,感激不尽。
Ps:我还是新手,接触matlab不是很久。
********************************************************************
%利用一个单输入单输出的两层bp网络训练一个输入为0到2*pi的9个样本点,期望的输出均为所取样本正弦函数值的神经网络系统,隐含层激活函数取Sigmoid函数,输出层取线性函数。(一个输入层,一个有4个神经元的隐含层,一个输出层)
%bp网络的第一阶段学习期(训练加权系数wki,wij)
%初始化
lr=0.5;%学习效率
err_goal=0.001;%期望误差最小值
max_epoch=10000;%训练的最大次数
a=0.7;%惯性系数
Oi=0;%置隐含层和输出层个神经元输出初值为零
Ok=0;
%提供9组训练集和目标值(1输入,1输出)
X=linspace(0,2*pi,9);
T=sin(X);
%初始化wki,wij(M为输入节点j的数量;q为隐含层节点i的数量;L为输出节点k的数量)
[M,N]=size(X);
q=4;
[L,N]=size(T);%N为训练集对数量
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)=NETk(k,i);
end
end
%计算输出误差函数
E=sum((T-Ok).^2)/2;
if(E<err_goal)break;end
%调整输出层加权系数
deltak=Ok.*(1-Ok).*(T-Ok);
w=wki;
wki=wki+lr*deltak*Oi'+a*(wki-wki0);
wki0=w;
%调整隐含层加权系数
deltai=Oi.*(1-Oi).*(deltak'*wki)';
w=wij;
wij=wij+lr*deltai*X'+a*(wij-wij0);
wij0=w;
end
epoch%显示计算次数
plot(E,epoch)%显示误差随训练次数的走向
********************************************************************
遇到问题就是:wij,wki,wij0,wki0,deltak,NETk,Ok,E。全都是NaN,不知道怎么回事,应该怎么处理。还有,最后显示的误差曲线图是空白的。
希望高手帮忙解决问题,感激不尽。
Ps:我还是新手,接触matlab不是很久。