2012-01-22 57 views
0
c=0; 
wih = .1*ones(nh,ni+1); 
who = .1*ones(no,nh+1); 

while(c<3000) 
    c=c+1; 
    for i = 1:length(x(1,:)) 


     for j = 1:nh 
      netj(j) = wih(j,1:end-1)*double(x(:,i))+wih(j,end)*1; 
      outj(j) = 1./(1+exp(-1*netj(j))); 
     end 

% hidden to output layer 

     for k = 1:no 

      netk(k) = who(k,1:end-1)*outj+who(k,end)*1; 
      outk(k) = 1./(1+exp(-1*netk(k))); 
      delk(k) = outk(k)*(1-outk(k))*(t(k,i)-outk(k)); 

     end 

% backpropagation 
     for j = 1:nh 
      s=0; 
      for k = 1:no 
       s = s+who(k,j)*delk(k); 
      end 

      delj(j) = outj(j)*(1-outj(j))*s; 

      s=0; 
     end 


     for k = 1:no 
      for l = 1:nh 
       who(k,l)=who(k,l)+.5*delk(k)*outj(l); 
      end 
      who(k,l+1)=who(k,l+1)+1*delk(k)*1; 
     end 

     for j = 1:nh 
      for ii = 1:ni 
       wih(j,ii)=wih(j,ii)+.5*delj(j)*double(x(ii,i)); 
      end 
      wih(j,ii+1)=wih(j,ii+1)+1*delj(j)*1; 

     end 



    end 

end 

这实现了反向传播神经网络。输入为x,t为期望输出,ni,nh,no输入,隐藏和输出层神经元的数量。我正在测试这个不同的功能,如AND,或者,它适用于这些。但XOR不起作用。神经网络的反向传播算法:异或训练

培训x = [0 0 1 1; 0 1 0 1] 培训t = [0 1 1 0]

who =权重矩阵从隐蔽到输出层

wih =权重矩阵从输入到隐层

你能帮忙吗?

+0

我建议你编辑你的问题,以便它是负责任的。它没有包含任何细节:“我在MATLAB中实现了反向传播算法” - 也许你应该先发布它。 –

+0

我已添加代码,请告知我是否需要更多解释。我现在应该期待你们的一些反馈 –

+1

你将权重初始化为相同的值。你确定这没关系吗?我不确定,但我认为这是一个糟糕的主意,可能是网络受到这种对称性的制约。 – Nabla

回答

1

XOR与所描述的所有其他功能之间的区别在于异或功能是而不是可线性分离。

可能发生的情况是您正在使用线性单位(线性激活函数)而不是S形单位(非线性激活函数)。另外,你确定你有隐藏层吗?

请张贴您的网络拓扑结构(简要),以及每层的单元类型。

+0

是的,有隐藏层,一个输入一个隐藏和一个输出层,我使用sigmoid激活,我可以更改隐藏层中的神经元数量,输入层维度2,输出为1,就像XOR一样,隐藏层我正在尝试不同数量的神经元,但都没有工作。我想我会包含代码 –