- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 45

Thema: einfaches neuronales Netz, inkl. deep learning

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hier gibt es ein kleines neuronales Netz auf einem Arduino Uno
    http://robotics.hobbizine.com/arduinoann.html

    Wie man schön sieht, reduziert sich das größtenteils auf mathematische Operationen, insbesondere Matrizenmultiplikationen. Eigentlich gibt es bei NN nur die Ebene der Mathematik und die der Infrastruktur, um die Mathematik möglichst effizient abzuarbeiten.

  2. #2
    HaWe
    Gast
    ich habe hier noch mal ein neueres Beispiel für ein einfaches Feed-Forward Netz bei mir gefunden, in C-ähnlich (NXC):
    Angehängte Dateien Angehängte Dateien

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Ich kehre mal wieder vom HTML-KeyPad zurück zum diesem Thread hier.

    Hier die Überleitung dazu:
    ..... wende ich mich dem Thema Arduino zu und beschäftige mich etwas damit. Einen guten Link dazu gab es ja. Mal schauen, wie weit man damit kommt. Leider gibts hier offenbar keinen, der in der Lage wäre, das Thema Neuronales Netz für Bastler verständlich darzustellen und Projekte, angefangen vom Arduino UNO, über schnellere nodeMCUs mit mehr Speicherplatz und schließlich darüber hinaus verständlich darzustellen und zu beschreiben. Wenn man im Laufe der Entwicklung ableitet, dass man noch schnellere und noch mehr Speicherplatz und noch andere Technik (wie Multitasking) benötigt, ist das durchaus sinvoll und hat seine Berechtigung und macht dann auch Sinn.
    Falls es jemand verpasst hat, nochmal hier lesen, was MXT schrieb.



    MfG

    - - - Aktualisiert - - -

    Ich hatte mir das gestern angeschaut. Wenn es funktioniert, ist es ein guter Anfang, denke ich. Muss ausprobiert werden, dafür gibt es einen UNO in der Schublade.

  4. #4
    HaWe
    Gast
    ja, ich habe den Code gecheckt (nicht getestet), es ist sicher ein guter Anfang, und weil alle Inputs und alle Ziel-Net-Outputs hard-coded sind, kann es auch ohne User-Interface auskommen.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Um mein Anliegen noch mal zu erläutern:


    Ich vertrete die Theorie, dass nur der, der neuronale Netze in der Grundfunktion verstanden hat und eigenständig aufbauen kann,
    in der Lage ist abzuschätzen, was ganz genau damit möglich und was nicht machbar ist oder, wozu es überflüssig ist.
    Und wenn bestimmte Probleme anstehen, ob man die besser mit einem neuronalen Netz löst und wenn, dann wie genau und in
    welchem Umfang.



    MfG

  6. #6
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Um mein Anliegen noch mal zu erläutern:


    Ich vertrete die Theorie, dass nur der, der neuronale Netze in der Grundfunktion verstanden hat und eigenständig aufbauen kann,
    in der Lage ist abzuschätzen, was ganz genau damit möglich und was nicht machbar ist oder, wozu es überflüssig ist.
    Und wenn bestimmte Probleme anstehen, ob man die besser mit einem neuronalen Netz löst und wenn, dann wie genau und in
    welchem Umfang.

    MfG
    ja, stimme zu, nur kann der "normale" Arduino viele Netztopologien gar nicht aufbauen, u.a. wegen mangelndem RAM - aber als Einstieg in jedem Falle richtig.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Genau zu solchen Dingen sollten wir uns hier hinarbeiten.



    MfG

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Das kleine Beispiel zeigt aus meiner Sicht sehr schön, was einen bei neuronalen Netzwerken an Berechnungen erwartet.

    Ich habe etwas den Eindruck, Moppi erwartet bei komplexeren NN irgendwelche komplexeren C Konstrukte in der Programmierung. Das ist aber so nicht der Fall, der komplexere Code ist nur die größere erforderliche Infrastruktur für die Berechnung der größeren neuronalen Netze. Im Grunde bleibt es auch bei komplexeren NN nur bei for-Schleifen, Arrays und den Grundrechenarten. Sonst gibt es da auf der Ebene der "einzelnen C Zeile" nicht wirklich was interessantes zu sehen.

    Es gibt einen festen Zusammenhang zwischen diesen Netzwerkstrukturen und dem mathematischen Gebiet der linearen Algebra. Ein Tensor, bekannt aus den Namen von NN Software wie TensorFlow oder TensorRT, ist dort die Veralgemeinerung von Skalaren, Vektoren, Matrizen usw.

    D.h. bei einem komplexeren NN habe ich noch mehr Vektoren, Matrizen usw. zu verrechnen. Sonst ändert sich da nix. Ob ich das Rechnen nur mit einem Prozessor, mit vielen oder mit Bleistift und Papier mache, ist dem NN völlig egal.

    NN werden heute gerne mit Grafikkarten Hardware berechnet, weil man da heute tausende (aber relativ doofe) Kerne in einem Chip hat. Da kann man die Zillionen Multiplikationen und Additionen halt schön schnell durchschieben. Auch Googles spezielle KI Prozessoren enthalten im wesentlichen nur viele Kerne, die nichts anderes als 256x256 Matrizen verarbeiten können.

  9. #9
    HaWe
    Gast
    Perzeptron-Learning und Backpropagation sind reine mathematische Matrizen-Operationen, die sich mathematisch (Formeln) und algorithmisch (Programmcode) darstellen lassen.
    Was passiert: Neurons sind Strukturen mit inneren Variablen, die beim Training schrittweise (Schleifen) so verstellt werden, bis für jeden Input der gewünschte Output "passt" (Approximierung), d.h. der Fehler (float) unter einem frei gewählten Grenzwert liegt.

    Für ein Verständnis habe ich mir damals KI-Bücher gekauft, wo beides schrittweise erklärt wird; in Web-Tutorials ist das sehr komprimiert, dennoch hier noch ein Link:

    https://towardsdatascience.com/perce...m-d5db0deab975

    Bild hier  

    Bild hier  

    Bild hier  

    Google: Perzeptron-Learning

  10. #10
    HaWe
    Gast
    ich habe jetzt versucht, Mxt's verlinktes NN auf dem ESP8266 zum Laufen zu kriegen, aber die Routinen führen dazu, dass der esp dauernd rebootet (wschl wegen watchdog timeout) - fast wie ich es befürchtet habe.
    Nach ein paar delay(1) zwischendrin rebootet er nicht mehr, aber es dauert nun sehr lange - mal gucken.....


    http://robotics.hobbizine.com/arduinoann.html
    Code:
    // A Neural Network for Arduino
    // http://robotics.hobbizine.com/arduinoann.html 
    // 2-layer Backpropagation net
    
    // modified by HaWe
    // version 0.0.2
    
    
    
    #include <math.h>
    
    #define REPORT_N 100
    
    /******************************************************************
     * Network Configuration - customized per network 
     ******************************************************************/
    
    const int PatternCount = 10;
    const int InputNodes = 7;
    const int HiddenNodes = 8;
    const int OutputNodes = 4;
    const float LearningRate = 0.3;
    const float Momentum = 0.9;
    const float InitialWeightMax = 0.5;
    const float Success = 0.00040;
    
    const byte Input[PatternCount][InputNodes] = {
      { 1, 1, 1, 1, 1, 1, 0 },  // 0
      { 0, 1, 1, 0, 0, 0, 0 },  // 1
      { 1, 1, 0, 1, 1, 0, 1 },  // 2
      { 1, 1, 1, 1, 0, 0, 1 },  // 3
      { 0, 1, 1, 0, 0, 1, 1 },  // 4
      { 1, 0, 1, 1, 0, 1, 1 },  // 5
      { 0, 0, 1, 1, 1, 1, 1 },  // 6
      { 1, 1, 1, 0, 0, 0, 0 },  // 7 
      { 1, 1, 1, 1, 1, 1, 1 },  // 8
      { 1, 1, 1, 0, 0, 1, 1 }   // 9
    }; 
    
    const byte Target[PatternCount][OutputNodes] = {
      { 0, 0, 0, 0 },  
      { 0, 0, 0, 1 }, 
      { 0, 0, 1, 0 }, 
      { 0, 0, 1, 1 }, 
      { 0, 1, 0, 0 }, 
      { 0, 1, 0, 1 }, 
      { 0, 1, 1, 0 }, 
      { 0, 1, 1, 1 }, 
      { 1, 0, 0, 0 }, 
      { 1, 0, 0, 1 } 
    };
    
    /******************************************************************
     * End Network Configuration
     ******************************************************************/
    
    
    int i, j, p, q, r;
    int ReportEvery_n;
    int RandomizedIndex[PatternCount];
    long  TrainingCycle;
    float Rando;
    float Error;
    float Accum;
    
    
    float Hidden[HiddenNodes];
    float Output[OutputNodes];
    float HiddenWeights[InputNodes+1][HiddenNodes];
    float OutputWeights[HiddenNodes+1][OutputNodes];
    float HiddenDelta[HiddenNodes];
    float OutputDelta[OutputNodes];
    float ChangeHiddenWeights[InputNodes+1][HiddenNodes];
    float ChangeOutputWeights[HiddenNodes+1][OutputNodes];
    
    
    //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    
    void setup(){
      Serial.begin(115200);
      delay(1000);
      randomSeed(analogRead(3));
      ReportEvery_n = 1;
      for( p = 0 ; p < PatternCount ; p++ ) {    
        RandomizedIndex[p] = p ;
      }
    }  
    
    
    //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    void loop (){
    
    
    /******************************************************************
    * Initialize HiddenWeights and ChangeHiddenWeights 
    ******************************************************************/
    
      for( i = 0 ; i < HiddenNodes ; i++ ) {    
        for( j = 0 ; j <= InputNodes ; j++ ) { 
          ChangeHiddenWeights[j][i] = 0.0 ;
          Rando = float(random(100))/100;
          HiddenWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ;
        }
      }
    /******************************************************************
    * Initialize OutputWeights and ChangeOutputWeights
    ******************************************************************/
    
      for( i = 0 ; i < OutputNodes ; i ++ ) {    
        for( j = 0 ; j <= HiddenNodes ; j++ ) {
          ChangeOutputWeights[j][i] = 0.0 ;  
          Rando = float(random(100))/100;        
          OutputWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ;
        }
      }
      Serial.println("Initial/Untrained Outputs: ");
      toTerminal();
    /******************************************************************
    * Begin training 
    ******************************************************************/
    
      for( TrainingCycle = 1 ; TrainingCycle < 2147483647 ; TrainingCycle++) {    
    
    /******************************************************************
    * Randomize order of training patterns
    ******************************************************************/
    
        for( p = 0 ; p < PatternCount ; p++) {
          q = random(PatternCount);
          r = RandomizedIndex[p] ; 
          RandomizedIndex[p] = RandomizedIndex[q] ; 
          RandomizedIndex[q] = r ;
        }
        Error = 0.0 ;
    /******************************************************************
    * Cycle through each training pattern in the randomized order
    ******************************************************************/
        for( q = 0 ; q < PatternCount ; q++ ) {    
          p = RandomizedIndex[q];
    
    /******************************************************************
    * Compute hidden layer activations
    ******************************************************************/
    
          for( i = 0 ; i < HiddenNodes ; i++ ) {    
             
            Accum = HiddenWeights[InputNodes][i] ;
            for( j = 0 ; j < InputNodes ; j++ ) {
              Accum += Input[p][j] * HiddenWeights[j][i] ;
            }
            Hidden[i] = 1.0/(1.0 + exp(-Accum)) ;
          }
    
    /******************************************************************
    * Compute output layer activations and calculate errors
    ******************************************************************/
    
          for( i = 0 ; i < OutputNodes ; i++ ) {  
               
            Accum = OutputWeights[HiddenNodes][i] ;
            for( j = 0 ; j < HiddenNodes ; j++ ) {
              Accum += Hidden[j] * OutputWeights[j][i] ;
            }
            Output[i] = 1.0/(1.0 + exp(-Accum)) ;   
            OutputDelta[i] = (Target[p][i] - Output[i]) * Output[i] * (1.0 - Output[i]) ;   
            Error += 0.5 * (Target[p][i] - Output[i]) * (Target[p][i] - Output[i]) ;
          }
    
    /******************************************************************
    * Backpropagate errors to hidden layer
    ******************************************************************/
    
          for( i = 0 ; i < HiddenNodes ; i++ ) {    
            Accum = 0.0 ;
            delay(1); 
            for( j = 0 ; j < OutputNodes ; j++ ) {          
              Accum += OutputWeights[i][j] * OutputDelta[j] ;
            }
            HiddenDelta[i] = Accum * Hidden[i] * (1.0 - Hidden[i]) ;
          }
    
    
    /******************************************************************
    * Update Inner-->Hidden Weights
    ******************************************************************/
    
    
          for( i = 0 ; i < HiddenNodes ; i++ ) {     
            delay(1); 
            ChangeHiddenWeights[InputNodes][i] = LearningRate * HiddenDelta[i] + Momentum * ChangeHiddenWeights[InputNodes][i] ;
            HiddenWeights[InputNodes][i] += ChangeHiddenWeights[InputNodes][i] ;
            for( j = 0 ; j < InputNodes ; j++ ) { 
              ChangeHiddenWeights[j][i] = LearningRate * Input[p][j] * HiddenDelta[i] + Momentum * ChangeHiddenWeights[j][i];
              HiddenWeights[j][i] += ChangeHiddenWeights[j][i] ;
            }
          }
    
    /******************************************************************
    * Update Hidden-->Output Weights
    ******************************************************************/
    
          for( i = 0 ; i < OutputNodes ; i ++ ) {    
             
            ChangeOutputWeights[HiddenNodes][i] = LearningRate * OutputDelta[i] + Momentum * ChangeOutputWeights[HiddenNodes][i] ;
            OutputWeights[HiddenNodes][i] += ChangeOutputWeights[HiddenNodes][i] ;
            for( j = 0 ; j < HiddenNodes ; j++ ) {
              ChangeOutputWeights[j][i] = LearningRate * Hidden[j] * OutputDelta[i] + Momentum * ChangeOutputWeights[j][i] ;
              OutputWeights[j][i] += ChangeOutputWeights[j][i] ;
            }
          }
        }
    
    /******************************************************************
    * Every 1000 cycles send data to terminal for display
    ******************************************************************/
        ReportEvery_n = ReportEvery_n - 1;
        if (ReportEvery_n == 0)
        {
          Serial.println(); 
          Serial.println(); 
          Serial.print ("TrainingCycle: ");
          Serial.print (TrainingCycle);
          Serial.print ("  Error = ");
          Serial.println (Error, 5);
    
          toTerminal();
    
          if (TrainingCycle==1)
          {
            ReportEvery_n = REPORT_N-1;
          }
          else
          {
            ReportEvery_n = REPORT_N;
          }
        }    
    
    
    /******************************************************************
    * If error rate is less than pre-determined threshold then end
    ******************************************************************/
    
        if( Error < Success ) break ;  
      }
      Serial.println ();
      Serial.println(); 
      Serial.print ("TrainingCycle: ");
      Serial.print (TrainingCycle);
      Serial.print ("  Error = ");
      Serial.println (Error, 5);
    
      toTerminal();
    
      Serial.println ();  
      Serial.println ();
      Serial.println ("Training Set Solved! ");
      Serial.println ("--------"); 
      Serial.println ();
      Serial.println ();  
      ReportEvery_n = 1;
    
      
    }
    
    
    
    
    void toTerminal()
    {
    
      for( p = 0 ; p < PatternCount ; p++ ) { 
        Serial.println(); 
        Serial.print ("  Training Pattern: ");
        Serial.println (p);      
        Serial.print ("  Input ");
        for( i = 0 ; i < InputNodes ; i++ ) {
          Serial.print (Input[p][i], DEC);
          Serial.print (" ");
        }
        Serial.print ("  Target ");
        for( i = 0 ; i < OutputNodes ; i++ ) {
          Serial.print (Target[p][i], DEC);
          Serial.print (" ");
        }
    /******************************************************************
    * Compute hidden layer activations
    ******************************************************************/
    
        for( i = 0 ; i < HiddenNodes ; i++ ) {    
          Accum = HiddenWeights[InputNodes][i] ;
          for( j = 0 ; j < InputNodes ; j++ ) {
            Accum += Input[p][j] * HiddenWeights[j][i] ;
          }
          Hidden[i] = 1.0/(1.0 + exp(-Accum)) ;
        }
    
    /******************************************************************
    * Compute output layer activations and calculate errors
    ******************************************************************/
    
        for( i = 0 ; i < OutputNodes ; i++ ) {    
          Accum = OutputWeights[HiddenNodes][i] ;
          for( j = 0 ; j < HiddenNodes ; j++ ) {
            Accum += Hidden[j] * OutputWeights[j][i] ;
          }
          Output[i] = 1.0/(1.0 + exp(-Accum)) ; 
        }
        Serial.print ("  Output ");
        for( i = 0 ; i < OutputNodes ; i++ ) {       
          Serial.print (Output[i], 5);
          Serial.print (" ");
        }
      }
    
     
    }
    - - - Aktualisiert - - -

    Update:
    konnte inzwischen ein paar delays wieder rausnehmen, klappt immer noch und ist wieder ein bisschen schneller.

    - - - Aktualisiert - - -

    jawohl, er hat das Training geschafft:

    Code:
    TrainingCycle: 5375  Error = 0.00040
    
      Training Pattern: 0
      Input 1 1 1 1 1 1 0   Target 0 0 0 0   Output 0.00775 0.00009 0.00431 0.00639 
      Training Pattern: 1
      Input 0 1 1 0 0 0 0   Target 0 0 0 1   Output 0.00092 0.00465 0.00439 0.99653 
      Training Pattern: 2
      Input 1 1 0 1 1 0 1   Target 0 0 1 0   Output 0.00244 0.00013 0.99975 0.00190 
      Training Pattern: 3
      Input 1 1 1 1 0 0 1   Target 0 0 1 1   Output 0.00038 0.00698 0.99533 0.99567 
      Training Pattern: 4
      Input 0 1 1 0 0 1 1   Target 0 1 0 0   Output 0.00609 0.99732 0.00555 0.00466 
      Training Pattern: 5
      Input 1 0 1 1 0 1 1   Target 0 1 0 1   Output 0.00173 0.99669 0.00484 0.99655 
      Training Pattern: 6
      Input 0 0 1 1 1 1 1   Target 0 1 1 0   Output 0.00034 0.99465 0.99296 0.00011 
      Training Pattern: 7
      Input 1 1 1 0 0 0 0   Target 0 1 1 1   Output 0.00005 0.99232 0.99417 1.00000 
      Training Pattern: 8
      Input 1 1 1 1 1 1 1   Target 1 0 0 0   Output 0.99110 0.00002 0.00254 0.00019 
      Training Pattern: 9
      Input 1 1 1 0 0 1 1   Target 1 0 0 1   Output 0.99327 0.00678 0.00002 0.99424 
    
    Training Set Solved! 
    --------
    Geändert von HaWe (01.11.2019 um 15:57 Uhr)

Ähnliche Themen

  1. Microsoft: Nächste Hololens nutzt Deep-Learning-Kerne
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 24.07.2017, 15:40
  2. Deep-Learning-Konferenz von Golem.de: Studierende bekommen Tickets günstiger
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 04.04.2016, 09:40
  3. Konferenz Quo Vadis 2016: Wie Deep Learning Games verändern kann
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 03.03.2016, 10:10
  4. Antworten: 7
    Letzter Beitrag: 31.01.2009, 22:41
  5. Neuronales Netz
    Von matren im Forum Software, Algorithmen und KI
    Antworten: 39
    Letzter Beitrag: 26.07.2004, 00:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests