为了账号安全,请及时绑定邮箱和手机立即绑定

Java XOR 神经网络未正确训练

Java XOR 神经网络未正确训练

慕哥6287543 2022-07-06 16:01:23
我有一个具有 2 个输入、2 个隐藏神经元和 1 个输出神经元的神经网络来解决这个xor问题。0.1我随机初始化 0 到 1 之间的权重,我使用带有sigmoid激活函数的学习率。当我只训练一个选项时,例如目标为 1 的 1 和 0,它可以正常工作并给出适当的猜测。但是,当我尝试将所有可能的输入一起训练时,输出会收敛到0.5-0.6.我尝试过改变学习率、随机初始化权重的范围以及网络训练的次数,但这对最终输出没有影响。这是我在GitHub 上的代码的链接。关于如何解决此问题的任何想法?
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我怀疑反向传播没有正确实施。例如http://users.pja.edu.pl/~msyd/wyk-nai/multiLayerNN-en.pdf在第 17 至 20 页中给出了概述。


- 类的tuneWeigths- 和delta_weights- 方法Output_Neuron被正确实现。但是,在此步骤weightDeltaHidden中,必须确定稍后Hidden_Neuron调整 -class 的权重时需要的数组(参见代码中的注释)。


- 类的tuneWeigths- 和delta_weights- 方法Hidden_Neuron似乎没有正确实现。在这里,除其他外,weightDeltaHidden必须使用先前确定的数组。


在下面的代码中,我进行了必要的更改,但实际上并未更改代码的设计。但也许重构是有意义的。


类的变化Output_Neuron:


...


private double[] weightedDeltaHidden;


...


Output_Neuron(int hiddenNeurons) {


    ...


    this.weightedDeltaHidden = new double[hiddenNeurons];

}


...


void tuneWeights(double LR, double[] hidden_output, int target) {

    double delta = (target - output) * f.dSigmoid(output);

    for (int i = 0; i < weights.length; i++) {

        weights[i] += delta_weights(i, LR, delta, hidden_output);

    }

}


double delta_weights(int i, double LR, double delta, double[] hidden_output) {

    weightedDeltaHidden[i] = delta * weights[i]; // weightedDeltaHidden is the product of delta of this output neuron and the weight of the i-th hidden neuron.

                                                 // That value is needed when the weights of the hidden neurons are tuned...

    return LR * delta * hidden_output[i];

}


...


double[] getWeightedDeltaHidden() {

    return weightedDeltaHidden;

}

类的变化Hidden_Neuron:


...


void tuneWeights(double LR, int[] inputs, double weightedDeltaHiddenTotal) {

    for (int i = 0; i < weights.length; i++) {

        weights[i] += delta_weights(LR, inputs[i], weightedDeltaHiddenTotal);

    }

}


private double delta_weights(double LR, double input, double weightedDeltaHiddenTotal) {

    double deltaOutput = f.dSigmoid(output) * weightedDeltaHiddenTotal;

    return LR * deltaOutput * input;

}


...

调整隐藏权重Network的 - 方法内- 类的变化:train


void train(int[] inputs, int target) {


    ...


    //tune Hidden weights

    for (int i = 0; i < numOfHiddenNeurons; i++) {

        double weightedDeltaHiddenTotal = 0;

        for (int j = 0; j < numOfOutputNeurons; j++) {

            weightedDeltaHiddenTotal += output_neurons[j].getWeightedDeltaHidden()[i]; // weightedDeltaHiddenTotal is the sum of the weightedDeltaHidden over all output neurons. Each weightedDeltaHidden

        }                                                                              // is the product of delta of the j-th output neuron and the weight of the i-th hidden neuron.

        hidden_neurons[i].tuneWeights(LR, inputs, weightedDeltaHiddenTotal);

    }

}

通过这些更改,1_000_000 次调用train(2 个隐藏神经元)的典型输出为


Error: 1.9212e-01 in cycle 0

Error: 8.9284e-03 in cycle 100000

Error: 1.5049e-03 in cycle 200000

Error: 4.7214e-03 in cycle 300000

Error: 4.4727e-03 in cycle 400000

Error: 2.1179e-03 in cycle 500000

Error: 2.9165e-04 in cycle 600000

Error: 2.0655e-03 in cycle 700000

Error: 1.5381e-03 in cycle 800000

Error: 1.0440e-03 in cycle 900000

0 0: 0.0170

1 0: 0.9616

0 1: 0.9612

1 1: 0.0597

以及 100_000_000 次调用train(2 个隐藏神经元)


Error: 2.4755e-01 in cycle 0

Error: 2.7771e-04 in cycle 5000000

Error: 6.8378e-06 in cycle 10000000

Error: 5.4317e-05 in cycle 15000000

Error: 6.8956e-05 in cycle 20000000

Error: 2.1072e-06 in cycle 25000000

Error: 2.6281e-05 in cycle 30000000

Error: 2.1630e-05 in cycle 35000000

Error: 1.1546e-06 in cycle 40000000

Error: 1.7690e-05 in cycle 45000000

Error: 8.6837e-07 in cycle 50000000

Error: 1.3603e-05 in cycle 55000000

Error: 1.2905e-05 in cycle 60000000

Error: 2.1657e-05 in cycle 65000000

Error: 1.1594e-05 in cycle 70000000

Error: 1.9191e-05 in cycle 75000000

Error: 1.7273e-05 in cycle 80000000

Error: 9.1364e-06 in cycle 85000000

Error: 1.5221e-05 in cycle 90000000

Error: 1.4501e-05 in cycle 95000000

0 0: 0.0008

1 0: 0.9961

0 1: 0.9961

1 1: 0.0053

隐藏神经元的增加会提高性能。下面显示了 1_000_000 次调用train(4 个隐藏神经元)的典型输出:


Error: 1.2617e-02 in cycle 0

Error: 7.9950e-04 in cycle 100000

Error: 4.2567e-04 in cycle 200000

Error: 1.7279e-04 in cycle 300000

Error: 1.2246e-04 in cycle 400000

Error: 1.0456e-04 in cycle 500000

Error: 6.9140e-05 in cycle 600000

Error: 6.8698e-05 in cycle 700000

Error: 5.1640e-05 in cycle 800000

Error: 4.4534e-05 in cycle 900000

0 0: 0.0092

1 0: 0.9905

0 1: 0.9912

1 1: 0.0089


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号