2017-02-22 52 views
2

再次感謝您花時間閱讀本文。XOR總是朝向0.5使用反向傳播在S形神經網絡C++

我知道這個問題已經被問了很多,我已經檢查了許多關於這個問題的帖子:不過,我對使用反向傳播的成功XOR學習的追求仍未完成。

我試着像建議的那樣,調整學習速度,動量,有/沒有偏見等,仍然沒有成功。

網絡包含2個輸入神經元,2個隱藏神經元,1個輸出,全部乙狀結腸。 對於每個輸入,輸出神經元似乎總是收斂在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 ClNeuron::UpdateWeights() 
{ 
    for(std::size_t i=0;i<this->m_input_connections.size();i++) 
    { 
     double momentum = this->m_input_connections[i]->m_weight_last_delta * this->m_input_connections[i]->m_momentum_value; 
     double new_weight_delta = this->m_learning_rate * this->m_error_gradient * this->m_input_connections[i]->m_data + momentum ; 
     this->m_input_connections[i]->m_weight += new_weight_delta; 
     this->m_input_connections[i]->m_weight_last_delta = new_weight_delta; 
     this->m_input_connections[i]->m_number_of_time_updated++; 
    } 
} 

傳遞函數

double ClNeuron::Sigmoid(double p_value) 
{ 
    return 1.00/(1.00 + std::exp(p_value*-1.00)); 
} 


double ClNeuron::SigmoidDerivative(double p_value) 
{ 
    double sigmoid = this->Sigmoid(p_value); 
    return sigmoid * (1.00 - sigmoid); 
} 

功能用於訓練

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; 
} 

再次感謝您讀這篇文章,我知道這個問題已經被問很多 ! 指引我在正確的方向將不勝感激。

回答

1

有趣的是,如果它可以幫助某人,從Sigmoid()網絡更改爲TanH()網絡解決了問題。

在某種意義上,這有一定道理,然而,S形transfert功能似乎非常適合這類問題,因爲XOR是已經標準化之間0 & 1 ...

相關問題