单层感知器训练?

时间:2014-09-11 01:56:02

标签: java machine-learning neural-network perceptron

我一直在尝试训练以下网络并获得合适的重量,但它一直在运行。任何人都可以告诉我代码中可能有什么问题吗?这里输入{8,1},{-1}}是使用signum函数的预期输出。

import java.util.Arrays;

public class ANN {

    public static void main(String args[]) {

        double threshold = 1.2;
        double learningRate = 0.08;

        // Init weights

        double[] weights = { -1.4, 1.8 };

        int[][][] trainingData = {
            {{8, 1}, {-1}},
            {{3, 2}, {-1}},
            {{6, 3}, {-1}},
            {{1, 4}, {-1}},
            {{9, 5}, {1}},
            {{5, 6}, {1}},
            {{2, 7}, {1}},
            {{4, 8}, {1}},
            {{7, 9}, {1}},
        };

        // Start training loop
        while (true) {
            int errorCount = 0;
            // Loop over training data
            for (int i = 0; i < trainingData.length; i++) {
                System.out.println("Starting weights: " + Arrays.toString(weights));
                // Calculate weighted input
                double weightedSum = 0;
                for (int ii = 0; ii < trainingData[i][0].length; ii++) {
                    weightedSum += trainingData[i][0][ii] * weights[ii];
                }

                // Calculate output
                int output = 0;
                if (threshold <= weightedSum) {
                    output = 1;
                }

                System.out.println("Target output: " + trainingData[i][1][0]
                        + ", " + "Actual Output: " + output);

                // Calculate error
                int error = trainingData[i][1][0] - output;
                System.out.println("Error:  " + error);
                // Increase error count for incorrect output
                if (error != 0) {
                    errorCount++;
                }

                // Update weights
                for (int ii = 0; ii < trainingData[i][0].length; ii++) {
                    weights[ii] += learningRate * error
                            * trainingData[i][0][ii];
                }

                System.out.println("New weights: " + Arrays.toString(weights));
                System.out.println();
            }

            // If there are no errors, stop
            if (errorCount == 0) {
                System.out
                        .println("Final weights: " + Arrays.toString(weights));
                System.exit(0);
            }
        }
    }

}

编辑:我认为问题来自计算输出的代码片段。它应该被翻转,以便如果总和大于阈值,则输出为1,否则为0。

    // Calculate output
                int output = 0;
                if (weightedSum > threshold) {
                    output = 1;
                }

2 个答案:

答案 0 :(得分:1)

我已经运行了你的代码并在(errorCount == 0)检查之前添加了一行:

System.out.println(errorCount);

这似乎在6到7之间振荡,这意味着神经网络总是生成无效的训练数据估计,无论训练量是多少。如果培训数据没有达到100%正确的训练数据,那么预计这将永远持续下去。

希望这有帮助!

答案 1 :(得分:1)

您的错误可能是积极的,也可能是消极的。在第一次运行中,错误为-1。因此,errorCount会递增,并且永远不会执行退出循环的代码。

完整培训的条件应该基于错误本身,而不是错误计数。当错误达到最低水平(您将根据您的输入设置)时,培训将被视为已完成。