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