【问题标题】:Neural Network is pretty bad神经网络非常糟糕
【发布时间】: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


【解决方案1】:

实际上,我认为网络以前无法正常工作,现在可以了。我以前学习神经网络的网站说,考虑到它的简单性,对于像我这样的网络来说,75% 是一个不错的结果。

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2014-07-12
    • 2010-09-16
    相关资源
    最近更新 更多