2011-09-20 103 views
6

错误阅读有关的神经网络(反向传播)的一些文章后,我尝试自己写一个简单的神经网络。神经网络,反向传播,在训练

香港专业教育学院决定XOR神经网络, 我的问题是,当我试图对网络进行训练, 如果我只用一个例子来训练网络,可以说,1,1,0(如输入1,输入2,targetOutput )。经过500次列车+ + - 网络回答0.05。 但如果我尝试更多然后一个例子(可以说2个不同的或全部的4种可能性)网络的目标是0.5作为输出:( 我在谷歌搜索为我的错误没有结果:S 生病尝试给尽可能多的细节我所能来帮助查找错误的:通过定义

有2,2,1和2,4,1(inputlayer,hiddenlayer,outputlayer)-ive尝试网络

-the输出为每个神经:

double input = 0.0; 
     for (int n = 0; n < layers[i].Count; n++) 
      input += layers[i][n].Output * weights[n]; 

而'i'是当前图层和权重是所有权重从前ous层。

value*(1-value)*(targetvalue-value); 

而“价值”是神经输出和“targetvalue”为当前神经目标输出:

-the最后层(输出层)误差由下式定义。

-the误差为其他neurals定义由:

foreach neural in the nextlayer 
      sum+=neural.value*currentneural.weights[neural]; 

-all网络中的权重由如下公式(从神经的重量 - >神经2)适应

weight+=LearnRate*neural.myvalue*neural2.error; 

而LearnRate是新学习率(在我的网络中定义为0.25)。 对于每个神经-the biasweight被定义为:

bias+=LearnRate*neural.myerror*neural.Bias; 

偏置是常量值= 1。

是几乎所有我可以详细, 正如我所说的输出目标为0.5不同的训练实例:(

非常感谢你非常多的帮助^ _ ^。

+2

您是否编写了自己的实现或者是否使用框架? –

+0

这真的很有趣,他保护后,他无法回答他的问题:) – PythEch

回答

1

这是如果没有看到完整的代码,很难判断错误发生在哪里。应该仔细检查的一件事是,您计算每个单元的局部误差梯度与您在该图层上使用的激活函数相匹配。 :http://www.learnartificialneuralnetworks.com/backpropagation.html

例如,日您对输出图层所做的计算假定您正在使用logistic sigmoid激活函数,但在上面的代码中未提及该函数,因此它看起来像是使用线性激活函数。

原则上一个2-2-1的网络应该是足够的学习XOR虽然训练会找个时间陷入局部极小,而不能收敛到正确的状态。因此,重要的是不要从单个培训课程中得出有关算法性能的结论。请注意,简单的backprog肯定会很慢,比如像Rprop这样的快速和更强大的解决方案。

有一些关于这个主题的书籍,它为一个简单的网络提供了详细的逐步计算(例如Nei nevvitsky的'A.I .:智能系统指南'),这可以帮助你调试你的算法。另一种方法是使用现有的框架(例如Encog,FANN,Matlab)来建立完全相同的拓扑和初始权重,并将计算与自己的实现进行比较。