0

我是神经网络的新手,我正在使用 Aforge 神经网络库来完成字符识别任务。我想使用反向传播来训练我的网络。这是 AForge 文档中给出的代码。

// initialize input and output values
        double[][] input = new double[4][] {
                new double[] {0, 0}, new double[] {0, 1},
                new double[] {1, 0}, new double[] {1, 1}
            };
        double[][] output = new double[4][] {
                new double[] {0}, new double[] {1},
                new double[] {1}, new double[] {0}
            };
        // create neural network
        ActivationNetwork network = new ActivationNetwork(
            SigmoidFunction(2),
            2, // two inputs in the network
            2, // two neurons in the first layer
            1); // one neuron in the second layer
        // create teacher
        BackPropagationLearning teacher = new BackPropagationLearning(network);
        // loop

        while (!needToStop)
        {
            // run epoch of learning procedure
            double error = teacher.RunEpoch(input, output);
            // check error value to see if we need to stop
            // ...
        }

但我不知道如何确定 ActivationNetwork 的层数和神经元数。任何帮助,将不胜感激。谢谢。

4

2 回答 2

0

我不确切知道,但在我看来,网络只能返回两个答案 - 0 和 1。所以一个神经元是 0,第二个是 1,第二层选择最大值。

于 2013-07-08T13:49:15.440 回答
0

对于 XOR,您需要一个隐藏层,因为输出的真值表是 0,1,1,0,这意味着您不能用一条线在几何上分离这些模式。这是光学证明. 如果您可以用一条线划分模式空间,您可以使用一个感知器,典型情况是 OR , AND。在这些情况下,您不使用隐藏层,因为它们是线性分离的。尝试制作相应的图表,以便看清楚并理解它。在所有情况下,您的类别 > 2 或类别不是线性分离的,您必须使用隐藏层。对于 XOR,您需要一个隐藏层(隐藏层是网络的计算层),因为一个隐藏层能够划分为多个类。现在由于有两个类,我们将有一个输出。这可以通过以下方式计算: outputNeurons<=2^nn=num of classes 例如,如果您有 3 个类,则需要 2 个 OutputNeurons 因为 2^2 = 4 < 3。现在在隐藏层中我们使用神经元,因为我们在 pic 中有两行1,两条线之间的区域称为决策区域 1,线外称为决策区域 2。因此,我们将有两个决策函数,因此我们必须有两个感知器,因为感知器将一个决策区域分类,数学术语是 func σ( x) = Σw*x + w0 并且在一个感知器的情况下,我们通常使用阶跃函数来激活(stepFunc(σ) = 1 如果 σ>0 或 stepFunc(σ) = 0 如果 s<=0)。隐藏层中的第一个神经元用于第一决策区域,第二个神经元用于第二决策区域。第一决策区域使用第一感知器将模式(1,1)与其他感知器分开,类似地第二感知器将模式(0,0)与其他感知器分开。最后,看看评论:
ActivationNetwork network = new ActivationNetwork( SigmoidFunction(2),//这里是本例中的激活函数 Sigmoid 2, // 网络中的两个输入-> 每次一个表 [0,1] [1,1] [1, 0] [1,1] 2, // 第一层的两个神经元-> 隐藏层 1); // 第二层的一个神经元-> 输出层

反向误差传播是一种算法,无法在这里向您展示它是如何工作的。您可以在此处查看更多详细信息。

希望它有助于更​​好地理解简单神经元网络的整个概念,但如果你想使用这些 Aforge 类,我的意见是你必须阅读神经网络背后的理论

于 2017-08-09T09:04:53.400 回答