wuwe1030
2011-06-24, 10:03
大家好,我是新手,最近刚接触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,'+');
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,'+');