在阅读了一些关于神经网络(反向传播)的文章后,我试着自己写一个简单的神经网络。
我已经决定了异或神经网络,我的问题是当我试图训练网络时,如果我只用一个例子来训练网络,假设1,1,0(如input1,input2,targetOutput)。经过500列+-网络回答0.05。但如果我尝试不止一个例子(假设有2种不同的或所有4种可能性),网络的输出目标是0.5 :(我在google上搜索我的错误,但没有结果:S I‘我会尽可能多地给出细节,以帮助找到错误的地方:
-ive尝试了具有2,2,1和2,4,1 (输入层,隐藏层,输出层)的网络。
定义的每个神经的-the输出:
double input = 0.0;
for (int n = 0; n < layers[i].Count; n++)
input += layers[i][n].Output * weights[n];而'i‘是当前层,而权重是来自上一层的所有权重。
-the最后一层(输出层)错误由以下定义:
value*(1-value)*(targetvalue-value);而'value‘是神经输出,'targetvalue’是当前神经的目标输出。
其他神经元的-the误差定义如下:
foreach neural in the nextlayer
sum+=neural.value*currentneural.weights[neural];神经网络中的权重根据这个公式进行调整(来自神经网络-all 2的权重)。
weight+=LearnRate*neural.myvalue*neural2.error;而LearnRate是网络学习率(在我的网络中定义为0.25 )。每个神经的-the偏置权重由以下定义:
bias+=LearnRate*neural.myerror*neural.Bias;bias是const value=1。
这就是我所能详细说明的所有内容,正如我所说的,输出的目标是0.5,不同的训练示例:
非常非常感谢你的帮助,^_^。
发布于 2011-09-23 01:30:51
如果看不到完整的代码,就很难判断出错误在哪里。您应该仔细检查的一件事是,您对每个单元的局部误差梯度的计算是否与您在该层上使用的激活函数相匹配。看看这里的一般公式:http://www.learnartificialneuralnetworks.com/backpropagation.html。
例如,您对输出层所做的计算假设您使用的是逻辑sigmoid激活函数,但您在上面的代码中没有提到这一点,因此看起来您使用的是线性激活函数。
原则上,2-2-1网络应该足以学习XOR,尽管训练有时会陷入局部最小值,而不能收敛到正确的状态。因此,重要的是不要从单个训练会话中得出关于算法性能的结论。请注意,简单的backprog一定会很慢,例如,有更快、更健壮的解决方案,比如Rprop。
有一些关于这个主题的书籍提供了简单网络的详细分步计算(例如Negnevitsky的“A.I.:智能系统指南”),这可以帮助你调试你的算法。另一种选择是使用现有的框架(例如Encog、FANN、Matlab)设置完全相同的拓扑和初始权重,并将计算结果与您自己的实现进行比较。
https://stackoverflow.com/questions/7478988
复制相似问题