Aufbau eines Neuronalen Netzes zum Erkennen des Differenzwinkels bei einer Linienverfolgung
 
  (EN google-translate) 
  (PL google-translate) 
Ziel der Umsetzung
- Ein autonomes Vehikel soll sich entlang einer bandförmigen Bodenmarkierung fortbewegen.
 
- Das vom Boden aufgezeichnete Kamerabild soll auf ein grobes Raster von 5x5 Quadraten reduziert werden.
 
- Dabei wird einem Quadrat der mittlere Grauwert der darunterliegenden Pixel zugewiesen.
 
  | 
Belernen
- Belernt soll das Fahrzeug zunächst testweise mit eindeutigen Mustern, die einen Winkel von 0o, +/-45o und +/-90o repräsentieren:
 
- Am Ausgang des Neuronalen Netzes soll ein Winkel als analoges Ausgangssignal eines einzelnen Neurons abgerufen werden können.
 
- Da die sigmoide Funktion Werte im Intervall [0,1] liefert und die Extremwerte weit im Sättigungsbereich liegen, soll der Winkelbereich [-90o,90o] durch ein Ausgangssignal von [0.25,0.75] abgebidet werden.
 
  | 
Bild 0-1: Lernpattern für die Erkennung der Linienführung.
 
- Es soll ein Neuronales Netz mit vier Schichten realisiert werden.
 
- Dabei bestehen die Eingangsschicht I und die Zwischenschichten II und III jeweils aus 25 Neuronen.
 
- Die Ausgangsschicht IV besteht aus einem Neuron.
 
- Die Implementierung soll in Java erfolgen.
 
- Die Schichten I, II und III sollen jeweils als ein Objekte der Klasse "Schicht" in Java realisiert werden.
 
- Alles andere soll über statische Methoden in einer main-Methode umgesetzt werden.
 
- Objekte der Klasse "Schicht" besitzen folgende Arrays:
 
  | 
- w[25][25] doppletes Array mit allen Gewichten.
 
- u[25] Array mit allen gewichtet aufsummierten Eingangsaktivitäten der 25 Neuronen.
 
- n[25] Aktivität der 25 Neuronen.
 
- in[25] Aktivitäten, die am Eingang anliegen, also die Ausgangsaktivität der vorangehenden Schicht.
 
  | 
- Weitere Arrays sind Hilfsvariablen für den Backpropagation Algorithmus:
 
  | 
- Q[25] Q-Werte - Diese werden von der vorangehenden Schicht gebraucht.
 
  | 
- Ob es nun 25, mehr oder weniger Neuronen in der Schicht geben soll, wird über einen dem Konstruktor übergebenen Wert n_anzahl festgelegt.
 
  | 
Bild 0-2: Darstellung einer Neuronenschicht mit allen zugehörigen Variablen.
 
- Die 25 Bildquadrate sind in folgender Weise den Eingängen der ersten Schicht zugeordnet:
 
  | 
Bild 0-3: Zuordnung zwischen Bildquadraten und Netzeingängen.
 
Vereinerung des Klassenentwurfs
- Aus folgendem UML-Diagramm können die zu implementierenden Attribute und Methoden für die Klasse Schicht abgelesen werden.
 
- Mit setInput() werden alle Werte des übergebenen Arrays in das innere Array in[] hineinkopiert, also keinesfalls einfach die Referenz zugewiesen.
 
  | 
Bild 0-4: UML-Diagramm der Klasse Schicht.
 
- Bei berechneQ() wird angegeben, das Q für welches Gewicht berechnet werden soll.
 
- Dabei ist "neuron" die Nummer des Neurons, zu dem das Gewicht hinläuft.
 
- wnr ist die Gewichtsnummer von den 5, die zu dem Neuron hinlaufen.
 
- outprop ist der zurückpropagierte Wert der Nachfolgeschicht, also entweder die Differenz zwischen Soll- und Ist-Ausgang, oder die Summe der gewichteten Q-Werte der Neuronen, zu denen die Verbindungen hinlaufen, die von dem Neuron abgehen, auf die die aktuell betrachtete Verbindung hinläuft. 
 
- outprop muß also mit Hilfe der Nachfolgeschicht berechnet werden.
 
  | 
Übung
- Vorbereitend auf die Umsetzung des Richtungserkenners, soll die Klasse Schicht implementiert und in das vorangehende Beispiel in Kapitel 8.3 als Zwischenschicht mit vier Neuronen eingefügt werden.
 
- Ein Objekt der Klasse Schicht soll also die vorhandene Implementierung der Zwischenschicht ersetzen.
 
- Erst nach erfolgreichem Test am Antivalenz-Netz soll der Richtungserkenner umgesetzt und mit den vorgegebenen Pattern belernt werden.
 
  |