回 帖 发 新 帖 刷新版面

主题:熟悉 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不是很久。

回复列表 (共2个回复)

沙发

没人肯帮吗? 我找了好久都不知道哪出错了

板凳

1.程序比较长,本人并没有耐心看下去,但是根据你的叙述,我可以肯定的是上述程序运行的时候应该是workspace中的某个变量计算出现NaN即非数。例如计算1/0,就会出现NaN。matlab有很好的容错能力,NaN也会继续运算,但是NaN的初等运算结果都会是NaN。而NaN值去描点绘图plot会是空点。
2.上述是神经网络的源代码,但是matlab处理神经网络问题已有相应工具箱和大量现成的函数可以调用,不需要这么“底层”的代码,另外还有图形交互模式可以训练网络,得出结果,不需要文本程序的,不明白你做神经网络编写这么底层的代码运行干嘛

我来回复

您尚未登录,请登录后再回复。点此登录或注册