Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Sigmoidal神经网络C+中使用反向传播,异或总是收敛到0.5+;_C++_Neural Network_Backpropagation - Fatal编程技术网

C++ 在Sigmoidal神经网络C+中使用反向传播,异或总是收敛到0.5+;

C++ 在Sigmoidal神经网络C+中使用反向传播,异或总是收敛到0.5+;,c++,neural-network,backpropagation,C++,Neural Network,Backpropagation,再次感谢您抽出时间阅读本文 我知道这个问题已经被问了很多,我也查阅了很多关于这个问题的帖子:然而,我对使用反向传播实现成功的XOR学习的探索仍然没有完成 我尝试过,就像建议的那样,调整学习速度、动力、没有/没有偏见等,但仍然没有成功 网络由2个输入神经元,2个隐藏神经元,1个输出,allSigmoids组成。 对于每个输入,输出神经元似乎总是在0.5左右收敛 因此,我要求你在这方面拥有宝贵的技能。 我使用自制的C++库(这样我就可以深入地学习基础知识是如何工作的)。 下面是我的代码的几行有趣的代

再次感谢您抽出时间阅读本文

我知道这个问题已经被问了很多,我也查阅了很多关于这个问题的帖子:然而,我对使用反向传播实现成功的XOR学习的探索仍然没有完成

我尝试过,就像建议的那样,调整学习速度、动力、没有/没有偏见等,但仍然没有成功

网络由2个输入神经元,2个隐藏神经元,1个输出,allSigmoids组成。 对于每个输入,输出神经元似乎总是在0.5左右收敛

因此,我要求你在这方面拥有宝贵的技能。 我使用自制的C++库(这样我就可以深入地学习基础知识是如何工作的)。 下面是我的代码的几行有趣的代码:

从输出神经元获取误差导数

void ClOutputSigmoidNeuron::ComputeErrorGradient()
{
    double wanted_output = this->m_dataset->GetNextData();
    double delta = wanted_output - this->m_result_buffer;
    this->m_error_gradient = delta * this->SigmoidDerivative(this->m_result_buffer);
}
void ClSigmoidNeuron::ComputeErrorGradient()
{
    double tmpBuffer = 0.00;
    for(std::size_t i=0;i<this->m_output_connections.size();i++)
    {
        ClNeuron* target_neuron = (ClNeuron*)m_output_connections[i]->m_target_neuron;
        tmpBuffer += (target_neuron->m_error_gradient * this->m_output_connections[i]->m_weight);
    }

    //Get the sigmoid derivative
    this->m_error_gradient = tmpBuffer * this->SigmoidDerivative(this->m_result_buffer);
}
从隐藏神经元获取误差导数

void ClOutputSigmoidNeuron::ComputeErrorGradient()
{
    double wanted_output = this->m_dataset->GetNextData();
    double delta = wanted_output - this->m_result_buffer;
    this->m_error_gradient = delta * this->SigmoidDerivative(this->m_result_buffer);
}
void ClSigmoidNeuron::ComputeErrorGradient()
{
    double tmpBuffer = 0.00;
    for(std::size_t i=0;i<this->m_output_connections.size();i++)
    {
        ClNeuron* target_neuron = (ClNeuron*)m_output_connections[i]->m_target_neuron;
        tmpBuffer += (target_neuron->m_error_gradient * this->m_output_connections[i]->m_weight);
    }

    //Get the sigmoid derivative
    this->m_error_gradient = tmpBuffer * this->SigmoidDerivative(this->m_result_buffer);
}
用于培训的功能

bool ClBackPropagationSupervisedTrainer::Train()
{
    for (std::size_t i = 0; i < this->m_dataset_size; i++)
    {
        this->m_network->Fire();

        if (!this->m_network->ComputeErrorGradients())
        {
            std::cout << "ClBackPropagationSupervisedTrainer:Train - Oups" << std::endl;
            return false;
        }

        this->m_network->UpdateWeights();
    }

    return true;
}
bool-ClBackPropagationSupervisedTrainer::Train()
{
对于(std::size\u t i=0;im\u dataset\u size;i++)
{
此->m_网络->火灾();
如果(!this->m_network->ComputeErrorGradients())
{
std::cout UpdateWeights();
}
返回true;
}
再次感谢您的阅读,我知道这个问题被问了很多!
如果能给我指出正确的方向,我将不胜感激。

有趣的是,如果它能帮助某人,从Sigmoid()网络改为TanH()网络解决了这个问题

在某种程度上,它确实是有意义的,然而,Sigmoid transfert函数似乎非常适合这种问题,因为XOR已经在0和1之间规范化了