2012-01-14 70 views
4

我正在matlab中制作一个反向传播的MLP神经网络。问题在于,它似乎无法很好地处理函数中的曲线,并且也不能很好地与值进行比较。例如,它可以达到cos(x)的80%,但如果我放置100 * cos(x),它根本就不会训练。MLP神经网络训练不正确,可能收敛到本地最小值

什么是更加古怪的是,有些功能能很好地训练到,而其他人只是没有在所有的工作.. 例如: 训练有素:http://img515.imageshack.us/img515/2148/coscox3.jpg

不太好:http://img252.imageshack.us/img252/5370/cos2d.jpg(被留下了很长一段时间)

错误的结果,平滑坚持这样:http://img717.imageshack.us/img717/2145/ex2ug.jpg

这是我想要实现算法中:

http://img594.imageshack.us/img594/9590/13012012001.jpg

http://img27.imageshack.us/img27/954/13012012002.jpg

这是我实现:

close all;clc; 

j=[4,3,1]; %number neurons in hidden layers and output layer 
i=[1,j(1),j(2)]; 

X=0:0.1:pi; 
d=cos(X); 

%-----------Weights------------% 
%-----First layer weights------% 
W1p=rand([i(1)+1,j(1)]); 
W1p=W1p/sum(W1p(:)); 
W1=rand([i(1)+1,j(1)]); 
W1=W1/sum(W1(:)); 

%-----Second layer weights------% 
W2p=rand([i(2)+1,j(2)]); 
W2p=W2p/sum(W2p(:)); 
W2=rand([i(2)+1,j(2)]); 
W2=W2/sum(W2(:)); 

%-----Third layer weights------% 
W3p=rand([i(3)+1,j(3)]); 
W3p=W3p/sum(W3p(:)); 
W3=rand([i(3)+1,j(3)]); 
W3=W3/sum(W3(:)); 
%-----------/Weights-----------% 

V1=zeros(1,j(1)); 
V2=zeros(1,j(2)); 
V3=zeros(1,j(3)); 

Y1a=zeros(1,j(1)); 
Y1=[0 Y1a]; 
Y2a=zeros(1,j(2)); 
Y2=[0 Y2a]; 

O=zeros(1,j(3)); 
e=zeros(1,j(3)); 

%----Learning and forgetting factor-----% 
alpha=0.1; 
etha=0.1; 
sortie=zeros(1,length(X)); 
while(1) 

n=randi(length(X),1); 
%---------------Feed forward---------------% 

%-----First layer-----% 
X0=[-1 X(:,n)]; 
V1=X0*W1; 
Y1a=tanh(V1/2); 

%----Second layer-----% 
Y1=[-1 Y1a]; 
V2=Y1*W2; 
Y2a=tanh(V2/2); 

%----Output layer-----% 
Y2=[-1 Y2a]; 
V3=Y2*W3; 
O=tanh(V3/2); 
e=d(n)-O; 
sortie(n)=O; 

%------------/Feed Forward-----------------% 

%------------Backward propagation---------% 

%----Output layer-----% 
delta3=e*0.5*(1+O)*(1-O); 
W3n=W3+ alpha*(W3-W3p) + etha * delta3 * W3; 

%----Second Layer-----% 
delta2=zeros(1,length(Y2a)); 
for b=1:length(Y2a) 
delta2(b)=0.5*(1-Y2a(b))*(1+Y2a(b)) * sum(delta3*W3(b+1,1)); 
end 

W2n=W2 + alpha*(W2-W2p)+ (etha * delta2'*Y1)'; 

%----First Layer-----% 
delta1=zeros(1,length(Y1a)); 
for b=1:length(Y1a) 
    for m=1:length(Y2a) 
      delta1(b)=0.5*(1-Y1a(b))*(1+Y1a(b)) * sum(delta2(m)*W2(b+1,m)); 


    end 
end 


W1n=W1+ alpha*(W1-W1p)+ (etha * delta1'*X0)';          
W3p=W3; 
W3=W3n; 

W2p=W2; 
W2=W2n; 

W1p=W1; 
W1=W1n; 

figure(1); 
plot(1:length(d),d,1:length(d),sortie); 

drawnow; 
end 

我的问题是,我能做些什么来纠正呢? 到目前为止,我的猜测是,我在反向传播中有问题,特别是在计算增量和权重时。或者我有权重初始化错误(太小,或不依赖于最初的输入)..

+0

当然,Matalb中有一个神经网络工具箱,还有很多围绕网络的实现。为什么不将结果与已知的工作进行比较? – Jorge 2012-01-14 07:14:50

+0

我似乎没有工具箱。 – patokun 2012-01-14 09:34:24

+0

参见http://homepages.cae.wisc.edu/~ece539/matlab/ – Jorge 2012-01-14 10:14:49

回答

3

我不是这方面的专家,但有一些经验玩基于Matlab和Java的神经网络系统。

我可以建议使用工具箱可以帮助你,它已经帮助了我所知道的其他人。

我能提供的信息有几点:

  • 不要指望NN对所有训练数据的工作,有时数据以这种方式

  • 的格式太复杂,分类你NN将会对汇聚服务表现

最后产生重大影响:

  • 当各种参数归一化为+/- 1时,像这样的训练算法通常会训练得更好。cos(x)是归一化的,100 * cos *(x)不是。这是因为所需的权重更新要大得多,而且培训系统可能会采取非常小的步骤。如果您的数据有多个不同的范围,那么标准化至关重要。可能我建议你先从最起码研究