【发布时间】:2018-06-27 23:11:49
【问题描述】:
我今天创建了一个学习 XOR 运算符的神经网络,它的工作原理非常棒。 然后我重构了它(不保存图像,呃),它不再工作了。
现在它又可以工作了,但是很糟糕:
Learing...
749142 out of 1000000 training samples were correct (74.9142%)
Testing...
756 out of 1000 testing samples were correct (75.6%)
今天早些时候,它在测试阶段总是会取得 100.0% 的成功... 我尝试了不同数量的隐藏层或隐藏层中的神经元,但我无法恢复到这些令人敬畏的结果。经过 1000000 次训练迭代后,它应该很容易达到 100.0% 对吧?
这是我的训练方法:
public void train() {
float delta = (float) ((1.0 - output)*(1.0+output) * error * NNetwork.LEARING_RATE);
for(NConnection n : inputs) {
n.getInputNeuron().error += n.getWeight() * error;
n.setWeight(n.getWeight() + n.output() * delta);
}
error = 0;
}
设置错误:
public float setError(float desired) {
error = desired - output;
return error;
}
输出计算:
public float calcOutput() {
if(isInputNeuron) {
return valueIfInputNeuron;
} else {
float input_sum = 0.0f;
for(NConnection n : inputs) {
input_sum += n.input() * n.getWeight();
}
output = lookupSigmoid(input_sum);
return output;
}
}
以上所有方法都在 Neuron 类中。 这是 Network 类用来训练自己的方法:
/**
* Trains the net by giving the correct desired result to it
* The network will then calculate its error and try to improve
* @param correctResult the correct desired result
* @return whether the average error per output neuron is below the acceptable error or not
*/
public boolean train(float correctResult) {
float totalOutputError = 0.0f;
for(int i = 0; i < output_layer.length; i++) {
totalOutputError += output_layer[i].setError(correctResult);
output_layer[i].train();
}
for (int i = hidden_layers.length-1; i >= 0; i--) {
for (int j = 0; j < hidden_layers[i].length; j++) {
hidden_layers[i][j].train();
}
}
if(Math.abs(totalOutputError / output_layer.length) < ACCEPTABLE_ERROR) {
return true;
} else {
return false;
}
}
有人看到这里有错误吗? 也许我的 sigmoid 函数不合适? 如果您需要,我可以发布更多代码...
(顺便说一下,当网络达到 100.0% 时,它有 2 个输入神经元、2 个隐藏神经元和 1 个输出神经元)
【问题讨论】:
-
或许了解如何在本地使用 GIT 或 SVN 会对您有所帮助,以帮助将来避免此问题
-
是的,通常我会保留图像,但这次我没有……没有什么特别的原因……我永远不会忘记再次这样做-.-
-
只用 2 个输入、2 个隐藏和 1 个输出训练一百万次似乎训练过度了。但我不是神经网络专家。
-
好吧,训练量减少并不会变得更好。而且由于我的训练数据是随机的,应该不是问题吧?
标签: java debugging machine-learning neural-network refactoring