この画像と同様の単純なニューロン関数をC++で記述しようとしています。私は活性化関数としてシグモイド関数を使用しています。 C++を使用したニューラルネットワークの単一ニューロン
これは、問題は、私は自分のコード内の任意の論理的な誤りをしたかどうか知らないです++ニューロン機能
#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;
}
ユニットテストを書いたことがありますか?いくつかの入力と期待される出力を定義し、これらの入力に対して関数をテストする単体テストを書く。 –
ここに投稿する前に、あなた自身の論理テストを行う必要があります – CoffeeandCode
理論上、それは大丈夫です。なぜあなたは尋ねましたか?あなたが心配している特定のことはありますか?コメントが言うように、いくつかのテストを書いてみてください。 – doctorlove