2016-08-09 5 views
-1

Ich versuche, eine einfache Neuronfunktion in C++ ähnlich diesem Bild zu schreiben. Ich verwende Sigmoid-Funktion als Aktivierungsfunktion. enter image description hereEinzelneuron im neuronalen Netzwerk mit C++

Das ist mein C++ Neuron Funktion

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

Das Problem ist, ich weiß nicht, ob ich logische Fehler in meinem Code. iter ist die Iterationsvariable, um zu prüfen, ob das Neuron zum ersten Mal aktiviert wird. Ist mein Neuron in einem neuronalen Netzwerk richtig geschrieben?

EDIT:

Auch wenn nicht von einem programmatischen oder Quant Hintergrund ich über die Programmierung fasziniert bin, neuronale Netze und künstliche Intelligenz. Ich habe eingebaute Funktionen in caret R verwendet, aber für mehr Verständnis möchte ich ein einfaches neurales Netzwerk von Grund auf neu erstellen. Ich habe die meisten Grundlagen aus dem Internet gelernt und poste hier meine Codes, weil ich sicher bin, dass ich ein unlogisches, aber ausführendes Skript gemacht habe.

#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

Haben Sie einige Komponententests geschrieben? Definieren Sie einige Eingaben und erwartete Ausgaben und schreiben Sie Komponententests, um Ihre Funktion mit diesen Eingaben zu testen. –

+1

Sie müssen Ihre eigenen logischen Tests vor dem Hochladen hier machen – CoffeeandCode

+0

In der Theorie sieht es in Ordnung - solange Sie irgendwo zufällig säen. Warum hast du gefragt? Gibt es eine bestimmte Sache, um die Sie sich Sorgen machen? Wie die Kommentare sagen, versuche einige Tests zu schreiben. – doctorlove

Antwort

2

Sie schreiben C-Code, nicht C++. C-Arrays kennen ihre eigene Größe nicht. Verwenden Sie std::vector<double> layer_inputs, damit Sie layer_inputs.size() anrufen können.

Andere C-Bits in Ihrem Code: deklarieren Sie keine Variablen, bis Sie sie benötigen; Sie haben activation viel zu früh erklärt. In der Tat würde ich es überhaupt nicht definieren - nur return 1.0/(1.0 + exp(-network));.

Verwandte Themen