0

由于我在这里获得和研究的帮助,我能够在 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+=error*100*0.1
2) 我想更深入地创建更多连接的神经元——我想我至少需要两个来为第三个提供输入。第三个将被输入值只是-1..1,这是正确的吗?我的目标是一个简单的模式识别,但到目前为止还不明白它应该如何工作。

4

2 回答 2

0

尝试将体重设置为两倍。

另外我认为使用数组要好得多,尤其是在神经网络中,而感知器是唯一的方法。

你将需要一些 for 或 while 循环来实现你想要的。

于 2013-03-28T08:15:17.430 回答
0

您的权重值范围从 -Infinity 到 +Infinity 是完全有效的。您应该始终使用实数而不是整数(如上所述,double 可以工作。32 位浮点精度对于神经网络来说已经足够了)。

此外,您应该在每个学习步骤中衰减您的学习率,例如在每次更新后将其降低 0.99 倍。否则,您的算法会在接近最佳值时出现振荡。

如果你想“更深入”,你需要实现一个多层感知器(MLP)。有证据表明,具有简单阈值神经元和多层的神经网络总是具有仅具有 1 层的等价物。这就是为什么几十年前研究界暂时放弃了人工神经网络的想法。1986 年,Geoffrey Hinton 使反向传播算法流行起来。有了它,您可以训练具有多个隐藏层的 MLP。

要解决 XOR 等非线性问题或模式识别等其他复杂问题,您需要应用非线性激活函数。首先看一下逻辑 sigmoid 激活函数。f(x) = 1. / (1. + exp(-x))。执行此操作时,您应该将输入和输出值标准化为 [0.0; 1.0]。这对于输出神经元尤其重要,因为逻辑 sigmoid 激活函数的输出正好定义在这个范围内。

可以在此答案中找到使用数组的前馈 MLP 的简单 Python 实现。

编辑:您还需要至少 1 个隐藏层来解决例如 XOR。

于 2013-03-28T12:19:01.017 回答