神经网络在XOR门测试中不起作用

时间:2019-12-24 12:48:54

标签: neural-network c++17

我正在尝试使用c ++实施监督式机器学习。我正在使用XOR来测试网络是否正常工作。但是,它不起作用。该错误确实会收敛,但是当我使用相同的输入来预测输出时,这些结果与预期的不一致。

输入:[[0,0],[0,1],[1,0],[1,1]]

预期输出:[[0],[1],[1],[0]]

层:2-> 2-> 1;学习率:0.1;激活函数:乙状结肠

我发现前向传播中没有错别字/算术问题,而且我认为向后传播中可能存在一些问题。

这是我的反向传播函数:

    void BackPropagate(){
    if (label_set.empty()) {
        printf("You Need To Set Up Your Labels First! (Call : \"SetLabel(...)\")\n");
        return;
    }

    unsigned int last_layer = layer_size - 1;
    // back prop of last layer
    for (unsigned int neu = 0; neu < neurons[last_layer].size(); ++neu){
        vector<double> y_sub = subtract(neurons[last_layer][neu].activated_output, transpose(label_set)[neu]); //(ŷ - y)
        vector<double> dacti_a; dacti_a.reserve(training_set_size);  // dsigmoid( sum_product_output )
        for (double value : neurons[last_layer][neu].output)
            dacti_a.push_back(deri_active(value, neurons[last_layer][neu].act_fcn));

        neurons[last_layer][neu].delta = multiply(y_sub, dacti_a);  // update delta

        // update weight and bias
        neurons[last_layer][neu].bias -= learning_rate * sum(neurons[last_layer][neu].delta);
        for (unsigned pren = 0; pren < connections[last_layer][neu].size(); ++pren) {
            connections[last_layer][neu][pren].weight -= learning_rate *sum(
                    multiply(neurons[last_layer][neu].delta,neurons[last_layer - 1][pren].output));
        }
    }

    // back prop of hidden layers
    for (unsigned int layer = last_layer - 1; layer > 0; --layer){
        for (unsigned int neu = 0; neu < neurons[layer].size(); ++neu){
            vector<double> weight_delta = multiply(neurons[layer + 1][0].delta,
                                                   vector<double>(), connections[layer+1][0][neu].weight);  // sum(weight*delta)

            for (unsigned int posn = 1; posn < neurons[layer+1].size(); ++posn)
                weight_delta = addition(weight_delta,
                        multiply(neurons[layer+1][posn].delta, vector<double>(), connections[layer+1][posn][neu].weight));

            vector<double> dsig_a; dsig_a.reserve(training_set_size);  // dsigmoid( sum_product_output )
            for (double value : neurons[layer][neu].output)
                dsig_a.push_back(deri_active(value, neurons[layer][neu].act_fcn));

            neurons[layer][neu].delta = multiply(weight_delta, dsig_a);  // update delta

            // update weight and bias
            neurons[layer][neu].bias -= learning_rate * sum(neurons[layer][neu].delta);
            for (unsigned pren = 0; pren < connections[layer][neu].size(); ++pren)
                connections[layer][neu][pren].weight -= learning_rate *
                        sum(multiply(neurons[layer][neu].delta, neurons[layer-1][pren].output));
        }
    }

}

仅供参考,这是我的完整代码:https://github.com/samuel8876170/NeuralNetwork

有人可以给我一些调试建议吗?

更新(2019年12月26日):我找到了一种解决方案,可以获取XOR门和其他门(OR / AND门)的正确结果,这将网络层增加到2-> 2-> 2-> 1然后解决了。但是,我的网络需要3层才能获得预期的结果,但在Internet上大多数只需要2层,这可能是什么原因?

0 个答案:

没有答案