由于我在这里收到并研究过的帮助,我能够在C#中创建一个简单的感知器,其代码如下:
int Input1 = A;
int Input2 = B;
//weighted sum
double WSum = A * W1 + B * W2 + Bias;
//get the sign: -1 for negative, +1 for positive
int Sign=Math.Sign(WSum);
double error = Desired - Sign;
//updating weights
W1 += error * Input1 * 0.1; //0.1 being a learning rate
W2 += error * Input2 * 0.1;
return Sign;
我不在这里使用Sigmoid,只得-1或1
我有两个问题:
1)我的权重是否达到-5等值是否正确?当输入是例如100,50就像:W1 + =错误* 100 * 0.1
2)我想更深入地创建更多连接的神经元 - 我想我至少需要两个才能为第三个提供输入。这是正确的,第三个将被赋予值-1.1?我的目标是简单的模式识别,但到目前为止还不明白它应该如何工作。
答案 0 :(得分:0)
尝试将权重设置为加倍。
另外我认为使用数组会更好,特别是在神经网络和感知器是唯一的方法。
你需要一些for或while循环才能成功。
答案 1 :(得分:0)
权重值的范围从-Infinity到+ Infinity是完全有效的。你应该总是使用实数而不是整数(如上所述,double将起作用。对于神经网络,32位浮点精度是完全足够的。)
此外,你应该在每个学习步骤中衰减你的学习率,例如:每次更新后将其减少0.99倍。否则,您的算法将在接近最佳值时振荡。
如果你想“更深入”,你需要实现一个多层感知器(MLP)。存在一个证据,即具有简单阈值神经元和多层的神经网络具有仅具有1层的等效物。这就是为什么几十年前研究界暂时放弃了人工神经网络的想法。 1986年,Geoffrey Hinton使Backpropagation算法变得流行。有了它,您可以训练具有多个隐藏层的MLP。
要解决XOR或其他复杂问题(如模式识别)等非线性问题,您需要应用非线性激活函数。看一下开始的逻辑sigmoid激活函数。 f(x)= 1. /(1. + exp(-x))。执行此操作时,您应将输入和输出值标准化为[0.0; 1.0]。这对输出神经元尤其重要,因为逻辑S形激活函数的输出恰好在此范围内定义。
使用数组的前馈MLP的简单Python实现可以是found in this answer。
修改:您还需要至少1个隐藏图层来解决,例如XOR。