Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2009-10-23
帖子: 2
声望力: 0 ![]() |
![]()
我用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 |
初级会员
注册日期: 2009-10-23
帖子: 1
声望力: 0 ![]() |
![]()
没看到你建立神经网络的语句,比如net=newff(minmax(P),[21,2],{'tansig','purelin'},'trainlm');
|
![]() |
![]() |
![]() |
#3 |
初级会员
注册日期: 2009-10-23
帖子: 2
声望力: 0 ![]() |
![]() |
![]() |
![]() |
![]() |
#4 |
初级会员
注册日期: 2009-03-11
年龄: 37
帖子: 11
声望力: 17 ![]() |
![]()
你单步调试过吗?单步调试显示你的wki和deltai交替无限增长,应该是某个公式用错了吧,(初步意见)
|
![]() |
![]() |
![]() |
#5 |
游客
帖子: n/a
|
![]()
最大迭代次数作为终止条件你貌似最后没用到
|
![]() |
![]() |
#6 |
初级会员
注册日期: 2013-04-02
帖子: 1
声望力: 0 ![]() |
![]()
输出层个神经元输出中没有用到S函数。
|
![]() |
![]() |