12,275
edits
mNo edit summary |
|||
(2 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
== Processing == | == Processing == | ||
[[Image: | [[Image:processing env example.png|thumb|200px|Processing IDE]] | ||
[[Processing]] ist eine Programmiersprache und Entwicklungsumgebung, die 2001 am Massachusetts Institute of Technology von den Erfindern [http://benfry.com/ Ben Fry] und [http://reas.com/ 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. | [[Processing]] ist eine Programmiersprache und Entwicklungsumgebung, die 2001 am Massachusetts Institute of Technology von den Erfindern [http://benfry.com/ Ben Fry] und [http://reas.com/ 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. | ||
Line 9: | Line 9: | ||
== Neuronale Netze == | == 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 [http://processing.org/reference/libraries/ Libraries] verwenden, die man dem Sketchbook beifügt. Als Beispiel wird hier die [http://www.shiffman.net/teaching/nature/nn/ nn-library] von Daniel Shiffman verwendet. | 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 [http://processing.org/reference/libraries/ Libraries] verwenden, die man dem Sketchbook beifügt. Als Beispiel wird hier die [http://www.shiffman.net/teaching/nature/nn/ nn-library] von Daniel Shiffman verwendet. | ||
Line 25: | Line 24: | ||
|} | |} | ||
Bei dem unten aufgeführtem Beispiel handelt es sich um eine leicht modifizierte Version eines neuronalen Netzes von Daniel Shiffman <ref>Daniel Shiffman: [http://www.shiffman.net/teaching/nature/nn/ The Nature of Code - Neural Networks]</ref>. Mittels eines [ | Bei dem unten aufgeführtem Beispiel handelt es sich um eine leicht modifizierte Version eines neuronalen Netzes von Daniel Shiffman <ref>Daniel Shiffman: [http://www.shiffman.net/teaching/nature/nn/ The Nature of Code - Neural Networks]</ref>. Mittels eines [[wikipedia:Multilayer perceptron]]s wird hier versucht das nichtlinear trennbare [http://en.wikipedia.org/wiki/Xor 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 niemals beide gleichzeitig 0 oder 1, sondern immer im Wechsel. 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 in den folgenden Beispielbildern als mögliches Antwortpaar für das Training via [[wikipedia:Backpropagation]] [0.2, 0.8] gewählt (siehe angepasste Wahrheitstabelle links). Damit wird dem Netz ein schnelleres Lernen ermöglicht, da die Ableitungen der [[wikipedia:Sigmoid function]] an diesen Stellen nicht allzu niedrig sind. Je weiter gen 0 und 1, desto niedriger werden die abgeleiten Werte (Anstieg der Tangenten an den jeweiligen Punkten) und desto weniger wird der Lernprozess beeinflusst, bzw. die Gewichte verändert. | ||
[[Image: | [[Image:processing neural network xor 1.png|thumb|left|100px|XOR possible state (1)]] | ||
[[Image: | [[Image:processing neural network xor 2.png|thumb|left|100px|XOR possible state (2)]] | ||
[[Image: | [[Image:processing neural network xor 3.png|thumb|left|100px|XOR possible state (3)]] | ||
[[Image: | [[Image:processing neural network xor 4.png|thumb|left|100px|XOR possible state (4)]] | ||
[[Image: | [[Image:processing neural network xor 5.png|thumb|left|100px|XOR possible state (5)]] | ||
<br clear="all" /> | <br clear="all" /> | ||
=== Anlegen eines neuronalen Netzes === | === Anlegen eines neuronalen Netzes === | ||
[[Image:neural network multilayer perceptron.png|thumb|200px|Multilayer Perceptron]] | |||
[[Image: | |||
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. | 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. | ||
Line 46: | Line 44: | ||
=== Trainieren des neuronalen Netzes === | === Trainieren des neuronalen Netzes === | ||
In der setup() Methode initialisiert man einmalig die Eingabewerte (hier mit den ursprünglichen Werten 0 und 1 für das XOR Problem), welche im globalen [ | In der setup() Methode initialisiert man einmalig die Eingabewerte (hier mit den ursprünglichen Werten 0 und 1 für das XOR Problem), welche im globalen [[wikipedia:Variable (programming)#Scope and extent|Scope]], d.h. dem programmweiten Namensraum, zur Verfügung stehen. Dies bedeutet, dass jede erstellte Methode und instanziierte Klasse auf diese Variablen Zugriff hat. | ||
<source lang="java"> | <source lang="java"> | ||
Line 118: | Line 116: | ||
Neuron from = c.getFrom(); | Neuron from = c.getFrom(); | ||
Neuron to = c.getTo(); | Neuron to = c.getTo(); | ||
// Only calculate the incoming connection's weight (input). | // Only calculate the incoming connection's weight (input) only. | ||
if (to == this) { sum += from.getOutput() * c.getWeight(); } | if (to == this) { sum += from.getOutput() * c.getWeight(); } | ||
} | } | ||
Line 181: | Line 179: | ||
</source> | </source> | ||
Daraufhin werden zuerst die äußeren Gewichte, vom Output zum Hidden Layer, angepasst. Die hier verwendete Lernrate (allgemein mit dem griechischen Buchstaben Eta bezeichnet) bestimmt zusätzlich den Lernfortschritt. Je größer dieser Wert, desto schneller lernt das Netz (mit größeren Sprüngen). Dabei kann es jedoch passieren, dass die Anpassungen zu schnell zu ungenau werden, oder man sogar zwischen Ergebnissen hin und her springt. | Daraufhin werden zuerst die äußeren Gewichte, vom Output zum Hidden Layer, angepasst. Die hier verwendete Lernrate (allgemein mit dem griechischen Buchstaben Eta bezeichnet) bestimmt zusätzlich den Lernfortschritt. Je größer dieser Wert, desto schneller lernt das Netz (mit größeren Sprüngen). Dabei kann es jedoch passieren, dass die Anpassungen zu schnell zu ungenau werden, oder man sogar zwischen Ergebnissen hin und her springt. Ein weiteres, schwerwiegendes Problem ist der Lernstillstand, der durch [http://reference.kfupm.edu.sa/content/o/n/on_the_problem_of_local_minima_in_backpr_67452.pdf lokale Minima] verursacht werden kann. | ||
<source lang="java"> | <source lang="java"> | ||
Line 198: | Line 196: | ||
<source lang="java"> | <source lang="java"> | ||
// For all hidden neurons... | |||
for (int i = 0; i < hidden.length; i++) { | for (int i = 0; i < hidden.length; i++) { | ||
connections = hidden[i].getConnections(); | connections = hidden[i].getConnections(); | ||
Line 203: | Line 202: | ||
for (int j = 0; j < connections.size(); j++) { | for (int j = 0; j < connections.size(); j++) { | ||
Connection c = (Connection) connections.get(j); | Connection c = (Connection) connections.get(j); | ||
// Sum up the output of all outgoing connections. | |||
if (c.getFrom() == hidden[i]) { sum += c.getWeight() * deltaOutput; } | if (c.getFrom() == hidden[i]) { sum += c.getWeight() * deltaOutput; } | ||
} | } | ||
for (int j = 0; j < connections.size(); j++) { | for (int j = 0; j < connections.size(); j++) { | ||
// Adjust the weight of all incoming connections accordingly. | |||
Connection c = (Connection) connections.get(j); | Connection c = (Connection) connections.get(j); | ||
if (c.getTo() == hidden[i]) { | if (c.getTo() == hidden[i]) { | ||
Line 232: | Line 233: | ||
[[Category:Neuronales Netz]] | [[Category:Neuronales Netz]] | ||
[[Category:Processing]] | [[Category:Processing]] | ||
[[Category:Neuronales Netz]] | [[Category:Neuronales Netz]] | ||
[[Category:Processing]] | [[Category:Processing]] |