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