我创建了一个程序,允许我创建灵活的任意大小/长度的神经网络,但是我使用XOR设置的简单结构来测试它(前馈,乙状结肠激活,反向传播,不配料)。XOR神经网络(FF)收敛到0.5
编辑:下面是一个全新的方法我原来的问题,其并没有提供足够的信息
编辑2:我开始我的体重-2.5和2.5之间,并在固定的一个问题,我代码,我忘记了一些否定。现在,无论是收敛于0的所有情况或1所有,而不是0.5
一切的工作正是我THINK应该的方式,但它是0输出和之间的融合,而不是摆向0.5的方向, 1.我已经完全掌握并计算了一个完整的前馈/计算增量误差/后向支持/等的设置,并且它与我从程序中获得的结果相匹配。我也尝试通过改变学习速率/动量来优化它,并且增加网络中的复杂性(更多神经元/层)。因此,我假定我的任一方程是错误的,或者在我的神经网络中有其他一些误解。以下是我遵循的每一步公式的逻辑:
我有一个输入层,有两个输入和一个偏差,一个隐藏2个神经元和一个偏差,以及一个带1个神经元的输出。
- 采取输入从两个输入神经元和神经元偏压的,然后通过各自的权重相乘它们,然后一起添加它们作为输入用于每个隐藏层的两个神经元的。
- 取出每个隐藏的神经元的输入,将其通过乙状结肠激活功能(参考)并将其用作神经元的输出。
- 取隐藏层中每个神经元的输出(偏差为1),将它们乘以它们各自的权重,并将这些值添加到输出神经元的输入。
- 通过Sigmoid激活函数传递输出神经元的输入,并将其用作整个网络的输出。
- 计算为输出神经元
- 的德尔塔错误(参考)计算德尔塔错误(参考)对于每个2个隐藏神经元
- 计算的梯度(参考)对于每个重量(从结束和工作开始)
- 计算每个权重的Delta Weight(参考),并将其加到其值中。
- 在由启动过程与更改输入和预期输出(参考)
下面是公式/过程(这些引用这可能是我的问题的细节!):
- x是神经元的输入:
(1/(1 + Math.pow(Math.E, (-1 * x))))
-1*(actualOutput - expectedOutput)*(Sigmoid(x) * (1 - Sigmoid(x))//Same sigmoid used in reference 1
SigmoidDerivative(Neuron.input)*(The sum of(Neuron.Weights * the deltaError of the neuron they connect to))
ParentNeuron.output * NeuronItConnectsTo.deltaError
learningRate*(weight.gradient) + momentum*(Previous Delta Weight)
- 我有依次值
0,1,1,0
在它的ArrayList。它需要第一对(0,1)
,然后预计1
。第二次通过,它需要第二对(1,1)
,并期望0
。它只是遍历每个新集合的列表。也许以这种系统的方式进行培训会导致问题?
就像我之前说,他们的理由,我不认为这是一个代码问题,是因为它匹配的正是我曾与纸和铅笔(如果有一个编码错误,就不会发生)来计算。
还当我初始化我的权重是第一次,我给他们0和1之间的随机双值本文认为这可能会导致一个问题:
Neural Network with backpropogation not converging 莫非是吗?
我使用n ^( - 1/2)规则,但没有解决它。
如果我可以更具体或想要其他代码让我知道,谢谢!
简短的摘要:我有一大堆的代码,我没有表现,因为我敢肯定它是正确的。但有些东西不起作用。怎么了? – Henry
@亨利是的,我很抱歉,但我不知道从哪里开始。它是三个类的组合,每个类都有几百行代码。然而,一个朝0.5的神经网络是一个非常具体的问题,我希望有人至少有一个方向让我开始寻找。我会添加我的deltaerror和梯度代码,因为这不太长 – MarshallD
@Henry我只是完全重新提供了更多的信息和解释区域的问题。希望你可以重新评估?谢谢! – MarshallD