Veranschaulichung des Lernens von künstlich neuronalen Netzwerken
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.

x | 0.00 | 0.25 | 0.50 | 0.75 | 1.00 | 1.25 | 1.50 | 1.75 | 2.00 |
sin(x) | 0 | 0.0043 | 0.0087 | 0.0130 | 0.017 | 0.0218 | 0.0261 | 0.0305 | 0.0348 |
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.

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.
Hier das Github-Repo zum Code: https://github.com/vincenteichhorn/neural-sinus
Theo
Mai 5, 2020, 5:36 pmKrasses Zeug man 🙂
Cooler Typ und ganzschön schlau :^)