kramann.info
© Guido Kramann

Login: Passwort:










8.4 Aufbau eines Neuronalen Netzes zum Erkennen des Differenzwinkels bei einer Linienverfolgung

8.4 (EN google-translate)

8.4 (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.
Lernpattern für die Erkennung der Linienführung.

Bild 8.4-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:
  1. w[25][25] doppletes Array mit allen Gewichten.
  2. u[25] Array mit allen gewichtet aufsummierten Eingangsaktivitäten der 25 Neuronen.
  3. n[25] Aktivität der 25 Neuronen.
  4. in[25] Aktivitäten, die am Eingang anliegen, also die Ausgangsaktivität der vorangehenden Schicht.
  • Weitere Arrays sind Hilfsvariablen für den Backpropagation Algorithmus:
  1. 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.
Darstellung einer Neuronenschicht mit allen zugehörigen Variablen.

Bild 8.4-2: Darstellung einer Neuronenschicht mit allen zugehörigen Variablen.

  • Die 25 Bildquadrate sind in folgender Weise den Eingängen der ersten Schicht zugeordnet:
Zuordnung zwischen Bildquadraten und Netzeingängen.

Bild 8.4-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.
UML-Diagramm der Klasse Schicht.

Bild 8.4-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.