2016-08-09 6 views
-1

この画像と同様の単純なニューロン関数をC++で記述しようとしています。私は活性化関数としてシグモイド関数を使用しています。 enter image description hereC++を使用したニューラルネットワークの単一ニューロン

これは、問題は、私は自分のコード内の任意の論理的な誤りをしたかどうか知らないです++ニューロン機能

#include<math.h> 

double neuron(double layer_inputs[],int iter) 
{ 

    // Feed forwarding single neuron 
    double network=0; 
    double bias=1; 
    double activation; 

    //get number of elements in the layer 
    const int num=sizeof(layer_inputs)/sizeof(layer_inputs[0]); 
    double weight[num]; 

    for (int i = 0; i < num; i++) 
    { 
     if(iter==0) 
     { 
     //first time assigning random weights 
      weight[i]=rand(); 
     } 

     //feed forwarding summation 
     network=network+(layer_inputs[i]*weight[i]+bias); 


    } 

    activation= 1.0/(1.0 + exp(-network)); //sigmoid activation function 

return activation; 
} 

私のCです。 iterは、ニューロンが最初にアクティブになっているかどうかを確認する反復変数です。ニューラルネットワークにニューロンを書くのは正しいですか?

EDIT:

にもかかわらずない私は、プログラミング、ニューラルネットワークと人工知能について魅了しています、プログラムまたは定量的な背景から。私はcaret Rでinbuilt関数を使用していますが、より理解するために、最初から簡単なニューラルネットワークを作成したいと考えています。私はインターネットからの基本のほとんどを学びました。私はいくつかの非論理的なスクリプトを実行したと確信していますので、私はここにコードを投稿しています。

#include<iostream> 
#include <math.h>//pow, exp 
#include "sqrtnn.h" //neuron() 


int main() 
{ 

    double input[]= {1,4,9,16,25,36,49,64,81,100}; 
    double output[]= {1,2,3,4,5,6,7,8,9,10}; 
    //number of layers 
    double layer=3; 
    double output_network[10]; 
    double error[10]; 
    double learning_rate=0.02; 
    //number of iterations 
    int iter=10; 
    int input_num=sizeof(input)/sizeof(input[0]); 
    std::cout<<"Simple neural network for solving square root\n \nINPUT -> OUTPUT\n\n"; 
    for (int i = 0; i < iter; i++) 
    { 
     for (int j = 0; j < input_num; j++) 
     { 
      for (int k = 0; k < layer; k++) 
      { 
       //feed forwarding 
       output_network[j] =neuron(input,i) ; //sigmoid activation function 

       //back propogation 
       error[j]=1/2*pow(output[j]-output_network[j],2);//error function 
       std::cout<<input[j]<<" -> "<< output[j]<<"= "<< error[j] <<"\n"; 


      } 
     } 
    } 


    return 0; 
} 
+2

ユニットテストを書いたことがありますか?いくつかの入力と期待される出力を定義し、これらの入力に対して関数をテストする単体テストを書く。 –

+1

ここに投稿する前に、あなた自身の論理テストを行う必要があります – CoffeeandCode

+0

理論上、それは大丈夫です。なぜあなたは尋ねましたか?あなたが心配している特定のことはありますか?コメントが言うように、いくつかのテストを書いてみてください。 – doctorlove

答えて

2

あなたはC++ではなくCのコードを書いています。 C配列は独自のサイズを知らない。 std::vector<double> layer_inputsを使用してlayer_inputs.size()に電話することができます。

コードの他のCビット:必要になるまで変数を宣言しないでください。 activationをあまりに早く宣言しました。実際、私は全く定義しません - ただreturn 1.0/(1.0 + exp(-network));です。

関連する問題