Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2011-06-24
年龄: 36
帖子: 1
声望力: 0 ![]() |
![]()
大家好,我是新手,最近刚接触ANN方面的东西,我用matlab做了一个简单的函数逼近的例子(没有用工具箱),逼近的函数是sin(x),但是在训练了10000次后,我发现我的网络还是不收敛的,不知道遇到的了什么问题,所以想请大家帮忙看下,谢谢。
代码:
clear; clc; format long; samplelist=0.02:0.02:3;%样本输入值 expectlist=sin(samplelist);% [m,n]=size(samplelist); inputNums=m;%输入节点数 samplelist = reshape(samplelist,n,m); sampleNums = n;%样本数 [m,n]=size(expectlist); outputNums=m;%输出节点数 expectlist = reshape(expectlist,n,m); hideNums=3;%隐层节点数 maxcount=10000;%最大训练次数 %samplenum=7;%总样本组数 precision=0.001;%精度 yita=0.5;%梯度下降的步长 alpha=0.5;%动量系数设定值 %count=1; %error=zeros(1,count); %errorp=zeros(1,samplenum); error=0.0; %v=rand(inputNums,hideNums); W1=rand(inputNums,hideNums);%输入层到隐层的权值矩阵 deltaW1=zeros(inputNums,hideNums);%W1修正值 W2=rand(hideNums,inputNums);%隐层到输出层的权值矩阵 deltaW2=zeros(hideNums,inputNums);%W2修正值 net1=zeros(inputNums,1);%输入层的样本值 O1=zeros(inputNums,1);%输入层的输出值 net2=zeros(hideNums,1);%隐层的输入值 O2=zeros(hideNums,1);%隐层的输出值 net3=zeros(outputNums,1);%输出层的输入值 O2=zeros(outputNums,1);%输出层的输出值 st1=zeros(hideNums,1); st2=zeros(outputNums,1); k=0; %%用sigmoid函数 %1/(1-exp(-x)) for i = 1:10000 %计算实际输出 index=round(random('unif',1,sampleNums,1));%产生一个随机数 d=expectlist(index,:)'; net1=samplelist(index,:)';%输入样本为样本集中的第index个 O1=1./(1-exp(-net1));%输入层输出 net2=W1'*O1; %隐层输入 O2=1./(1-exp(-net2));%隐层输出 net3=W2'*O2; %输出层输入 O3=1./(1-exp(-net3));%输出层输出 error = norm(O3-d); % if error <= precision % break; % end %修正权值 sigma2=(d-O3).*O3.*(1-O3);%输出层 sigma1=O2.*(1-O2).*(W2*sigma2);%隐层 %st1 = st1+yita*sigma1; %st2 = st2+yita*sigma2; deltaW1 = -yita*O1*sigma1' + alpha*deltaW1; deltaW2 = -yita*O2*sigma2' + alpha*deltaW2; W1= W1 + deltaW1; W2= W2 + deltaW2; k=k+1; end testarray=0.01:0.04:2.01; TO1=1./(1-exp(-testarray)); TI2=W1'*TO1; TO2=1./(1-exp(-TI2)); TI3=W2'*TO2; testres=1./(1-exp(-TI3)); plot(testarray,testres,'+'); |
![]() |
![]() |