Veranschaulichung des Lernens von künstlich neuronalen Netzwerken

By Vincent 1 comment

Künstlich neuronale Netzwerke können dafür genutzt werden aufgrund von Daten eine Funktion abzubilden bzw. ein Tool zu entwickeln, welche eine Funktion erlernt ohne die Funktionsgleichung zu kennen. So können z. B. Zusammenhänge in komplexen Daten hergestellt werden. Die Möglichkeiten der Nutzung sind groß. Um den Lernprozess besser zu verstehen ist es dabei nützlich diesen zu visualisieren. Hierfür habe ich mir ein kleines Tool in Java entwickelt, welches genau das kann. Dabei habe ich jedoch keine abgefahrenen Daten verwendet bei denen man wirklich keine mathematische Funktionsgleichung berechnen kann, sondern einfach Daten aus der Sinuskurve. Als Eingabe verwende ich also die Argumente der Sinusfunktion und als Ausgabe sollen die Funktionswerte erscheinen.

Hier ein Modell des verwendeten neuronalen Netzes
x0.000.250.500.751.001.251.501.752.00
sin(x)00.00430.00870.01300.0170.02180.02610.03050.0348
Wertetabelle der Sinusfunktion

Also ging es jetzt ans Programmieren. Um in Java ein neuronale Netzwerk zu verwenden benutzte ich eine von mir geschriebene Klasse, welche dies sehr vereinfacht: mehr dazu hier

Mit javax.swing kann man relativ einfach ein Fenster erstellen, auf welchem man unterschiedliche Komponenten platzieren kann. Mit dem JLable Komponent kann man auch eine paintComponent()-Methode erstellen, welche es ermöglicht einige dinge zu zeichnen.

So: Ein Koordinatensystem und die Sinusfunktion sind schonmal da.

Jetzt muss noch das neuronale Netzwerk bestückt werden: Dafür werden die Daten normalisiert und dann mit brain.train(input, target) dem neuronalen Netzwerk gegeben

int[] hidden = {10};
NeuralNetwork brain = new NeuralNetwork(1, hidden, 1, 0.1);
double xval = Util.map(j, 0, 1000, 0, (int) Math.PI * 2);
double yval = function(xval);
double[] input = { Util.map(xval, 0, (int) Math.PI * 2 , 0, 1) };
double[] target = { Util.map(yval, -4, 4, 0, 1) };
brain.train(input, target);
double function(double x) {
	return Math.sin(x);
}

Mit brain.getGuess(input) wird nun der aktuelle Output abgerufen und eine weitere Kurve kann in das Koordinatensystem gezeichnet werden.

double[] output = brain.getGuess(input);

Ebenfalls habe ich noch einen Schriftzug für die Durchläufe des Backpropagation-Algorithmus hinzugefügt.

Es lebt! Hier das Ergebnis. Unten ist noch ein Diagramm der Error-Daten zu sehen.

Hier das Github-Repo zum Code: https://github.com/vincenteichhorn/neural-sinus

1 Comment

Theo

Mai 5, 2020, 5:36 pm Antworten

Krasses Zeug man 🙂
Cooler Typ und ganzschön schlau :^)

Schreibe einen Kommentar