登录论坛

查看完整版本 : [问题] 求助BP神经网络的问题


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,'+');

大学生
2012-05-25, 02:23
大概扫了一眼程序,瞎提些意见,望谅:
1.程序中的“废话”太多,直接定义一个1-3-1的网络结构就可以了;
2.输入层-隐层及隐层-输出层中未考虑偏置的问题,基础理论应加强;
3.尽量不要定义最大训练次数,用while条件语句;
4.precision定义了,但似乎后面没用过;
5.最好采用一些通用的英文表述法,如precision换为ErrorTolerance,yita换为eta,expect换为desired等等。