Neuronale Netze Aufgaben 2 martin.loesch@kit.edu (0721) 608 45944
Aufgabe 3: Netz von Perzeptronen Die Verknüpfung mehrerer Perzeptronen zu einem Netz erlaubt die Lösung auch komplexerer Probleme als nur die linear separierbaren. Löse mit Hilfe eines Netzes von mehreren Perzeptronen das dargestellte Klassifikationsproblem (2 diskrete Eingänge, mögliche Werte: {0, 1, 2, 3}). Aufbau der Lösung: 2 Eingaben, das eigentliche Netz von Perzeptronen, pro zu erkennender Klasse je ein x 1 Ausgabe-Perzeptron. x 2 Aufgabe 2
Lösung Aufgabe 3 (1) namespace FL = Flood; FL::Perceptron ex3horiz(2), ex3diag(2), ex3blackcross(2), ex3greencircle(2), ex3bluesquare(2); void initexercise3perceptrons() { ex3horiz.set_activation_function(fl::perceptron::linear); [...] ex3horiz.set_bias(1.5); FL::Vector<double> ex3hweights(2); ex3hweights[0] = 0.0; ex3hweights[1] = -1.0; ex3horiz.set_synaptic_weights(ex3hweights); ex3diag.set_bias(-2.25); FL::Vector<double> ex3dweights(2); ex3dweights[0] = 0.5; ex3dweights[1] = 0.5; ex3diag.set_synaptic_weights(ex3dweights); ex3blackcross.set_bias(-0.5); FL::Vector<double> ex3bcweights(2); ex3bcweights[0] = 1.0; ex3bcweights[1] = 0.0; ex3blackcross.set_synaptic_weights(ex3bcweights); ex3greencircle.set_bias(0.25); FL::Vector<double> ex3gcweights(2); ex3gcweights[0] = -0.5; ex3gcweights[1] = -0.5; ex3greencircle.set_synaptic_weights(ex3gcweights); ex3bluesquare.set_bias(-0.5); FL::Vector<double> ex3bsweights(2); ex3bsweights[0] = 0.0; ex3bsweights[1] = 1.0; ex3bluesquare.set_synaptic_weights(ex3bsweights); } 3
Lösung Aufgabe 3 (1) void calculateexercise3(double* signals) { FL::Vector<double> inputsignals(2); inputsignals[0] = signals[0]; inputsignals[1] = signals[1]; double horizres = ex3horiz.calculate_output (inputsignals); inputsignals[0] = signals[0]; inputsignals[1] = signals[1]; double diagres = ex3diag.calculate_output (inputsignals); inputsignals[0] = horizres; inputsignals[1] = diagres; double bcres = ex3blackcross.calculate_output (inputsignals); inputsignals[0] = horizres; inputsignals[1] = diagres; double gcres = ex3greencircle.calculate_output (inputsignals); inputsignals[0] = horizres; inputsignals[1] = diagres; double bsres = ex3bluesquare.calculate_output (inputsignals); cout << "Exercise 3: BlackCross=" << (thresholdwithnull(bcres)?"true":"false ) << " GreenCircle=" << (thresholdwithnull(gcres)?"true":"false ) << " BlueSquare=" << (thresholdwithnull(bsres)?"true":"false") << endl; } 4
Aufgabe 4: Lernen eines Perzeptrons Die Einstellung der Gewichte eines Perzeptron per Hand ist aufwändig und fehlerträchtig. Der Perzeptron-Lernalgorithmus stellt daher eine sinnvolle Alternative dar. a) Implementieren Sie eine Funktion, die (gegeben eine Menge von Trainingsdaten) die Gewichte eines Perzeptrons einlernen kann. b) Verwenden Sie die neu implementierte Lernfunktion, um Gewichte einzulernen für Perzeptronen zur Realisierung einer (1) AND-Funktion (2) OR-Funktion 5
FRAMEWORK FÜR PERZEPTRON-LERNEN 6
Lernen - Geometrische Interpretation Hilfsmenge { } N = x x = x, x N Neues Lernproblem xw > 0, x N P Im Beispiel: alle x i aus P
Perzeptron Lernalgorithmus Start: Gegeben Lerndatenmenge P N Der Gewichtsvektor w(0) wird zufällig generiert. Setze t:=0. Testen: Ein Punkt x in P N wird zufällig gewählt. Falls x P und w(t) x > 0 gehe zu Testen Falls x P und w(t) x 0 gehe zu Addieren Falls x N und w(t) x < 0 gehe zu Testen Falls x N und w(t) x 0 gehe zu Subtrahieren Addieren: Setze w(t+1) = w(t)+x. Setze t:= t+1. Gehe zu Testen. Subtrahieren: Setze w(t+1) = w(t)-x. Setze t:=t+1. Gehe zu Testen.
Vorgegebener Ablauf: Framework-Quelldatei Daten laden Perzeptron trainieren Perzeptron verwenden Trainingsdaten werden aus Datei geladen: TrainingData* loaddatafromfile(filename) Perzeptron wird trainiert: Perzeptron* trainnewperceptron(traindata) MUSS IMPLEMENTIERT WERDEN! Perzeptron wird verwendet/getestet: void runperceptron(perceptron* neuron) 9
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,- 10