GMU:Neuronale Netze - eine Einführung für Künstler/Präsentation/Neuronale Netze in Processing
Processing
Processing ist eine Programmiersprache und Entwicklungsumgebung, die 2001 am Massachusetts Institute of Technology von den Erfindern Ben Fry und Casey Reas als quelloffenes Projekt ins Leben gerufen wurde. Die Sprache wurde speziell für die Bereiche Simulation und Animation entworfen und richtet sich daher vorwiegend an Personen aus der Gestaltung und Kunst.
Das sogenannte Sketchbook verkörpert das Prinzip einer stark vereinfachten IDE (Integrated Development Environment). Dem Nutzer steht eine simple Toolbar, ein Editor und Textfeld zur Verfügung. Über das Hauptprogramm hinaus erzeugte Klassen werden in eigenen Tabs untergebracht. Jede dieser Sketches ist tatsächlich nur eine Unterklasse der PApplet Java-Klasse, welche fast alle Features der Sprache implementiert. Alle zusätzlich erstellten Klassen werden beim Kompilieren als innere Klassen behandelt. Wenn man in Java programmieren will, muss dies explizit geschehen.
Weitere Informationen bzgl. Processing und dessen Verwendung lassen sich auf der Hauptseite und im Wiki-Eintrag zu Processing finden.
Neuronale Netze
Da man in Processing direkt in Java programmieren kann, sind einem bzgl. der Komplexität der Programme keine Grenzen gesetzt. Für die einfache Erstellung neuronaler Netze kann man zusätzliche Libraries verwenden, die man dem Sketchbook beifügt. Als Beispiel wird hier die nn-library von Daniel Shiffman verwendet.
i(1) | i(2) | ⊕ |
---|---|---|
0.2 | 0.2 | 0.2 |
0.2 | 0.2 | 0.8 |
0.8 | 0.2 | 0.8 |
0.8 | 0.8 | 0.2 |
Bei dem unteren Beispiel handelt es sich um eine leicht modifizierte Version eines neuronalen Netzes von Daniel Shiffman [1]. Mittels eines Multilayer Perceptrons wird hier versucht das nichtlinear trennbare XOR Problem zu lösen. Jede Ecke des Würfels entspricht einer 0 oder 1, wobei sich gleiche Werte je Fläche diagonal spiegeln, d.h. benachbarte Eckpunkte sind nie gleich 0 oder 1. Zwischen 2 Eckpunkten wird entlang der Flächen interpoliert, sodass man für Werte zwischen 0 und 1 eine Annährung erhält. Zur Verdeutlichung wurde im Folgenden als mögliches Antwortpaar für das Training via Backpropagation [0.2, 0.8] gewählt (siehe angepasste Wahrheitstabelle rechts).
Anlegen eines neuronalen Netzes
Zunächst erzeugt man ein neues Netzwerk, für welches man vorgibt, wieviele input und hidden Neuronen enthalten sein sollen. Zusätzlich wird je Ebene intern ein BIAS Neuron angelegt (siehe Abbildung rechts). Nach Modifikation der Library wäre es ebenfalls möglich die Anzahl der Output-Neuronen zu bestimmen. Davon wurde hierbei jedoch abgesehen. Desweiteren müssen die initialen Eingabewerte für das neuronal Netz erstellt werden.
Network net = new Network(2,3);
ArrayList inputs = new ArrayList();
In der setup() Methode initialisiert man die Eingabewerte:
void setup() {
size(400, 400, OPENGL);
inputs.add(new float[] { 0.2, 0.2 });
inputs.add(new float[] { 0.8, 0.2 });
inputs.add(new float[] { 0.2, 0.8 });
inputs.add(new float[] { 0.8, 0.8 });
}
Referenzen
- ↑ Daniel Shiffman: The Nature of Code - Neural Networks