Neuronale Netze Aufgaben 3 martin.loesch@kit.edu (0721) 608 45944
MLNN IN FLOOD3 2
Multi Layer Neural Network (MLNN) Netzaufbau: mehrere versteckte (innere) Schichten Lernverfahren: Backpropagation-Algorithmus [Rumelhart86, Werbos74] Neuronenaufbau: nichtlineare Aktivierungsfunktion -1-1 i1-1 i2 i3 i4 i5 3
MLNN anlegen: MLNN in Flood3 anlegen FL::MultilayerPerceptron mlnn(#inputs,hiddenl,#outputs); #inputs : Anzahl der Eingabekanäle hiddenl : Konfiguration der Hidden Layers FL::Vector<int> mit Anzahl der Hidden Neurons pro Layer #outputs : Anzahl der Ausgabekanäle Aktivierungsfunktionen per Default Hidden Layers: Hyperbolic Tangent ([-1,+1]) Output Neurons: Linear 4
Topologieauswahl Zusammenhang zwischen Anzahl der (hidden) layer und Zielfunktion? 3 Layer (1 hidden Layer - sigmoid): jede Boolsche Funktion jede kontinuierliche beschränkte Funktion [Cybenko 1989, Hornik et al. 1989] 4 Layer (2 hidden Layer -sigmoid) beliebige Funktionen mit beliebiger Genauigkeit [Cybenko 1988] Schon eine geringe Tiefe ist ausreichend 5
Lernverhalten - Topologieauswahl Anzahl der Neuronen pro Schicht im Bezug zu der Anzahl von (stochastisch unabhängigen) Lerndaten ist wichtig Aber: allgemeine Aussage nicht möglich Beispiel: gestrichelte Kurve soll eingelernt werden wenig Neuronen viele Neuronen wenig Lerndaten 6
Fehlermaß benötigt, z.b. Trainieren in Flood3 FL::SumSquaredError errormeasure(mlnn, traindata); mlnn : MLNN das trainiert werden soll traindata : benutzte Trainingsdaten (s.u.) Lerner benötigt, z.b. FL::GradientDescent learner(errormeasure); evtl. interessante Parameter: maximum_epochs_number, display_period, minimum_evaluation_improvement trainieren: learner.train(); 7
Overfitting Fehler auf Verifikationsdaten steigt ab einer Anzahl von Lernzyklen Mögliches Abbruchkriterium für Lernvorgang 8
Trainingsdaten in Flood3 Hauptcontainer InputTargetDataSet FL::InputTargetDataSet samples(#inst, #in, #out) #inst : Anzahl der Trainingsbeispiele #in : Anzahl Eingaben/Beispiel #out : Anzahl Ausgaben/Beispiel Befüllen mittels samples.set_data(datamatrix) Datensatz jeweils: Matrix FL::Matrix<double> matrix(rows, columns) Zeile setzen mittels matrix.set_row(i, vec) Zeilen : FL::Vector<double> (Inhalt: [Input 0,, Output 0, ]) 9
Auswahl repräsentativer Trainingsbeispiele Lerndaten für die Anpassung der Gewichte Verifikationsdaten für das Testen der Generalisierung gute Verteilung der Beispiele Klassifikation: Daten aus allen Klassen Regression: gesamter Definitionsbereich Beispiele insbesondere aus komplexen Regionen Klassifikation: Randregionen zwischen Klassen Regression: Verlaufsänderungen 10
Aufgabe 5: XOR mittels MLNN Das XOR-Problem soll dieses Mal mittels Lernen gelöst werden. Verwende die MultilayerPerceptron Klasse von Flood, um ein (parameterisierbares) MLNN zu erstellen, das mittels eigener Daten zur Implementierung der XOR- Funktion trainiert wird. Welche Topologie des Netzes? Welche Trainingsdaten? 11
FRAMEWORK FÜR LERNEN MIT DATEN AUS TEXTDATEI 12
Empfohlener Ablauf: Framework-Quelldatei Daten laden MLNN anlegen MLNN trainieren MLNN verwenden Trainingsdaten werden aus Datei geladen: TrainingData* loaddatafromfile(filename) siehe Datei: MlnnFromFileApplication.h/.cpp 13
Anzahl der Eingänge Eine Instanz pro Zeile Komma-separierte Werte Daten-Dateiformat Letzer Wert: Klasse der Instanz Beispiele: anddata.txt 2 0,0,- 0,1,- 1,0,- 1,1,+ ordata.txt 2 0,0,- 0,1,+ 1,0,+ 1,1,+ xordata.txt 2 0,0,- 0,1,+ 1,0,+ 1,1,- 14
Aufgabe 6: Komplexeres einfaches Beispiel Das in Aufgabe 3 gestellte Klassifikationsproblem soll jetzt nochmal gelöst werden, dieses Mal aber mittels eines gelernten MLNN. Zur Bereitstellung von vielen Trainingsdaten bietet sich das Laden einer einfachen Textdatei an, z.b. float f1=0, f2=0, f3=0, f4=0; FILE* myfile; myfile = fopen("test.txt", "r"); while (!feof(myfile)){ fscanf(myfile, "%f %f %f %f\n", &f1, &f2, &f3, &f4); std::cout << "Read: " << f1 << " " << f2 << " " << f3 << " " << f4 << std::endl; } fclose(myfile); x 1 x 2 Aufgabe test.txt 20.0 2.1 1.0 0.0 18.0 7.3 0.0 1.0 15
Aufgabe 7: Schrifterkennung Jetzt zu einer richtigen Anwendung: Wir wollen versuchen, Ziffern zu erkennen. Ziffern werden repräsentiert mittels einer 8x6-Matrix, die einen Scan darstellt. a) Die Ziffern 1 und 7 sollen unterschieden werden mittels eines MLNN. b) Ein MLNN soll trainiert werden, das nach Eingabe eines solchen Datensatzes die Ziffer erkennt. Die Trainingsdaten sollen dabei selbst erzeugt werden. 16