【问题标题】:ANN Perceptron OR-Gate training does not work correctlyANN 感知器 OR-Gate 训练无法正常工作
【发布时间】:2017-03-27 18:47:42
【问题描述】:

所以我试图用一个感知器来训练一个或门。问题是它不起作用。错误的是 0 0 -> 期望 = 0,实际 = 1。而且那个不会改变。

此外,当我放置要测试的权重时,它们似乎也根本不起作用,但这可能是我的 testOut 函数有问题。

public class Temp {

double[][] data = {{0.d, 0.d}, {0.d, 1.d}, {1.d, 0.d}, {1.d, 1.d}};
double[] outputs = {0.d, 1.d, 1.d, 1.d};
double[][] weights = {
        {ThreadLocalRandom.current().nextDouble(-.5, .5),
                ThreadLocalRandom.current().nextDouble(-.5, .5)},
        {ThreadLocalRandom.current().nextDouble(-.5, .5),
                ThreadLocalRandom.current().nextDouble(-.5, .5)},
        {ThreadLocalRandom.current().nextDouble(-.5, .5),
                ThreadLocalRandom.current().nextDouble(-.5, .5)},
        {ThreadLocalRandom.current().nextDouble(-.5, .5),
                ThreadLocalRandom.current().nextDouble(-.5, .5)}
};

public double[][] train(int maxEpoch, double threshhold) {
    for (int i = 0; i < maxEpoch; i++) {
        System.out.println("EPOCH " + i);
        double sum = 0.0d;
        double actualOutput = 0.0d;
        double[] ep = new double[outputs.length];
        for (int j = 0; j < data.length; j++) {
            for (int k = 0; k < data[j].length; k++) {
                sum += data[j][k] * weights[j][k];
            }
            actualOutput = step(sum - threshhold);
            ep[j] = outputs[j] - actualOutput;
            for (int k = 0; k < data[j].length; k++) {
                weights[j][k] = weights[j][k] + .1 * data[j][k] * ep[j];
            }
            System.out.println("output " + j + " " + actualOutput + " " + outputs[j] +" - " + ep[j]);
        }
    }
    return weights;

}

public void testOut(double[][] data, double[][] weights, double threshhold){
    double sum = 0;
    double[] actualOutput = new double[data.length];
    for (int j = 0; j < data.length; j++) {
        for (int k = 0; k < data[j].length; k++) {
            sum += data[j][k] * weights[j][k];
        }
        actualOutput[j] = step(sum - threshhold);
    }
    System.out.println(Arrays.toString(actualOutput));
}

public static void main(String[] args) {
    Temp t = new Temp();
    double[][] weights = t.train(200, 0);
    t.testOut(t.data, weights, .5);
}
}

任何帮助表示赞赏。

编辑:step(sum - threshold) 是阶跃函数。

public static int step(double x) {
        return x >= 0.d ? 1 : 0;
}

【问题讨论】:

  • 能否也提供steps()方法定义??
  • public static int step(double x) { return x >= 0.d ? 1:0; }
  • O/p 类似于:EPOCH 0............,EPOCH 1........,----EPOCH 199。然后在哪里 ru遇到问题??你到底想要什么??
  • 基本上我把数据放在 x1, x2 值中,输出应该代表一个或门,所以 0 0 -> 0, 0 1 -> 1 等...问题是它没有t 收敛(有 200 个 epoch,这很多。实际上应该在 ~5 内收敛)。所以我不断得到 0 0 -> 1,这是一个错误,不应该是这种情况。

标签: java artificial-intelligence perceptron


【解决方案1】:

所以我有点解决了这个问题。由于阈值的值,阶跃函数返回 0。我改为.2d,现在它工作正常。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2017-05-10
    • 2016-03-02
    • 1970-01-01
    • 2021-09-07
    • 2017-04-19
    • 2013-12-23
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多