Neural network 神经网络不';异或门测试中的t工作 我尝试用C++实现有监督的机器学习。我正在使用XOR测试网络是否正常工作。但是,它不起作用。误差确实会收敛,但当我使用相同的输入来预测输出时,它们并不像预期的那样

Neural network 神经网络不';异或门测试中的t工作 我尝试用C++实现有监督的机器学习。我正在使用XOR测试网络是否正常工作。但是,它不起作用。误差确实会收敛,但当我使用相同的输入来预测输出时,它们并不像预期的那样,neural-network,c++17,Neural Network,C++17,输入:[[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! (Cal

输入:[[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));
        }
    }

}
void BackPropagate(){
if(label_set.empty()){
printf(“您需要先设置标签!(调用:\“SetLabel(…)\”)”)\n);
返回;
}
unsigned int last_layer=layer_size-1;
//最后一层背撑
对于(无符号整数neu=0;neu<神经元[最后一层].size();++neu){
向量y_sub=subtract(神经元[最后一层][neu]。激活的_输出,转置(标签集)[neu]);/(ŷ-y)
向量dacti_a;dacti_a.reserve(训练集大小);//dsigomoid(和积输出)
for(双值:神经元[最后一层][neu]。输出)
dacti_a.推回(deri_active(值,神经元[最后一层][neu].动作[fcn]);
神经元[last_layer][neu].delta=multiply(y_sub,dacti_a);//更新delta
//更新权重和偏差
神经元[last_layer][neu]。偏差-=学习率*和(神经元[last_layer][neu]。δ);
对于(无符号pren=0;pren0;--层){
对于(无符号整数neu=0;neu
仅供参考,以下是我的完整代码:https://github.com/samuel8876170/NeuralNetwork

谁能给我一些调试的建议

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