PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NeuronalesNetz



reuabreliz
22.09.2009, 11:34
Hallo ich bin das erste Mal hier auf dem Forum. Ich hätte hier gerne einen Thread erstellt für Neuronale Netze, Ideen dazu und so weiter. Da ich selber mich an einem probieren beziehungsweise schon damit angefangen habe. Dabei benutze ich die Psprache C++, aber ich möchte hier nur theoretische Fragen stellen.

Eine Frage dazu ob ich das mit dem Backpropagation Funktion verstanden habe. Man hat das Ergebnis und gibt ihm als Input das verfälschte Ergebnis und lässt es dann lernen (Gewichte durch Maxima Funktionen verändern). Kann ich dann theoretisch dem Netz alles lernen. (Hindernisse ausweichen, usw.)

Weiters würde ich mich über gute Quellen zu diesem Gebiet freuen vor allem wo die Herleitung der Funktionen genau und einfach beschrieben ist, denn die habe ich nicht ganz verstanden

ikarus_177
22.09.2009, 13:02
Hi,

mir erscheint dieses Thema sehr interessant! Gibts vielleicht irgendwo eine Anleitung/Buch, in welchem beschrieben wird, wie man diese Netze in C/C++ umsetzt?
Wie hast du damit angefangen?

Vielen Dank,
ikarus_177

Bammel
22.09.2009, 19:01
mich würde schonmal ein kleines basiswissen interessieren.. am besten eine seite wo recht simpel erklärt wird wie soetwas funktioniert... oder aufgebaut ist.

the.speciali
22.09.2009, 19:41
Hi,

Mich würde es auch interessieren wie du ein Neuronales Netz in C++ programmierst.

@Bammel: Ein guter Einstieg liefert D. Kriesel (http://www.dkriesel.com/science/neural_networks). Ist mit fast 200 Seiten sehr umfangreich, aber auch so ziemlich das Beste was es im deutschsprachigen Raum gibt ;) Mich stört blos die zweispaltige Schreibweise... Aber sonst sehr informativ. (Bin noch selber nicht ganz durch, ist an manchen Stellen doch seehhhrr mathematisch das Ganze :-k )

mfg
the.speciali

gast1234
22.09.2009, 21:07
Das ist ein sehr schönes Skript. Man muß nicht gleich alles von vorne bis hinten verstehen.
Für das angesprochene Backpropagation ist meine Meinung nach von Interesse:
das Perzeptron
das SingleLagenPerzeptron
das MultilagenPerzeptron
die Aktivierungsfunktion
Deltaregel
Zum Verständniss der linearen Separierbarkeit helfen die graphischen Darstellung wie Abb. 5.10
Es hilft sehr sich das geometrisch vorzustellen bzw. zu visualisieren.
Die Programmiersprache ist eigentlich total egal. In einer objektorientierten Sprache wie C++ lässt es sich eben leichter strukturieren. Wenn man das NN im Prinzip verstanden, sollten zur Implementierung kaum Fragen offen sein.

thewulf00
23.09.2009, 09:11
Hallo Leute.

Das Thema ist auch für mich interessant. Die theoretischen Grundlagen hab ich soweit verstanden, aber: Worauf niemand irgendwo eingeht, ist, wie man sich die Geometrie eines Netzes für ein bestimmtes Problem herleiten kann.
Weiß jemand Rat?

Netzman
23.09.2009, 09:35
Von irgendwelchen Faustregeln, wie man bestimmte Problemstellungen geometrisch auflöst, habe ich eigentlich noch nirgends etwas gesehen. Das beruht ansich mehr auf Erfahrung und Durchprobieren.
In den meisten Fällen wird man im üblichem Aufbau in der Eingabeschicht für jeden sensorischen Input ein Neuron nehmen, in der Ausgabeschicht für jeden Output jeweils eines, und in einer Mittelschicht auch ein paar, wobei man nicht sagen könnte, ob das Netz mit 20 oder erst mit 21 Neuronen funktioniert... könnte auch mit 30 oder nur 10 noch gehen (Hausnummern).
Mindestens gleich wichtig wie die Auswahl der Neuronenverteilung und Synapsen ist auch die Auswahl der Trainingsdaten sowie eine ausreichende Menge davon.

mfg

reuabreliz
23.09.2009, 19:10
Mein neuronales Netz funktioniert noch nicht, bzw. wahr ich in letzter Zeit ein wenig faul. Mein eigentliches Prinzip wäre aber folgendes:

1.) Grundlegend ist das Perzeptron. (mehrere Eingänge, einen Output)

2.) Weiters kommen die Schichten die aus Perzeptronen in einer Schicht bestehen. Die Schichten dienen dazu, dass (das Programm, Mensch, Formel) weiß welches Perzeptron zu welcher Schicht gehört. Da ja Neuronale Netze normalerweiße Schichtweiße arbeiten.

3.) Als letztes verbinde ich die Schichten zu einer Neuronenmatrix. Damit ich weiß in welcher Reihenfolge die Schichten kommen.

Bild dazu im Anhang.

Die Verbindung stelle ich durch Zeiger her. Beispiel zur Grafik: Wir nehmen Perzeptron 1 und 2. Nun hat Perzeptron 1 als Input die Werte der Neuronen 1, 2 und 3 und als Output den Wert von Neuron 4. Das Perzeptron 2 hat als Input den Wert der Neuronen 4, 5 und 6. Der Wert von Neuron 4 ist somit sowohl Output von Perzeptron 1 und Input von Perzeptron 2.
Programmiertechnisch habe ich das mit Zeiger gelöst. Das heißt das das Perzeptron 1 einen Zeiger (Output) auf den Wert von Neuron 4 hat und Perzeptron einen Zeiger (Input) auf das Neuron 4 hat.

Hoffe das war verständlich geschrieben. Weitere Schritte sollten ziemlich logisch sein wenn man das Prinzip seines Lernalgorythmus verstanden hat. (Backpropagation, usw.)

Bammel
23.09.2009, 20:35
leider ist kein bild vorhanden

gast1234
23.09.2009, 23:42
Nehmt Euch das einfache Prezeptron vor, das ist quasi ein Neuron.

Eine weitere Annahme: unsere Training/Erkennungsdaten bestehen aus 2 Dimensionen, und könnten somit in ein Koordinatensystem auf Millimeterpapier eingezeichnet werden, wie Positionen auf einer Landkarte.

Es definiert sich aus dem Eingabevektor multipliziert mit dem Gewichtsvektor und addiert bzw. vermindert um eine Schwelle. Diese Formel findet Ihr überall.

Damit definiert es eine Gerade die die senkrecht zum Gewichtsvektor steht.
Die Gerade selber trennt unsere Trainings/Erkennungsdatenfläche in 2 Zonen, nämliche die links und rechts davon. Alle Elemente die auf der einen Seite liegen erkennt das Perzeptron, alle auf der anderen verwirft es. Durch die Änderung der Gewichte schafft Ihr es diese Trennebene rotieren zu lassen. Damit könnte ihr mehr oder weniger gut erreichen, die guten von den schlechten Testeingaben zu trennen, nichts anderes macht das Perzeptron. Mit der Änderung des Schwellenwertes schafft Ihr es diese Trenngerade zu verschieben. Damit kann man also die Gerade recht gut positionieren, die Guten ins Kröpfchen, die Schlechten Ihr wisst schon...
Nun kann es aber vorkommmen, dass trotz bester Ausrichtung der Gerade nicht alle Trainingsdaten korrekt klassifiziert werden können, weil etwa schlechteund gute Daten zu sehr aneinander liegen. Die Daten sind dann nur schwer oder vielleicht gar nicht separierbar. Deswegen muss man dafuer sorgen, dass diese breiter gefächert sind. Das kann man schaffen indem man weitere Merkmale hinzunimmt. Das Perzeptron, welches eine Trenngerade bildet, hat nämlich nur 2 Eingänge, wie die x und y Koordinate. Möchte man eine weitere Dimension, wie die z Koordinate hinzufügen, wird die Gerade, die die Fläche teilt, zu einer Trennebene im Raum. Nimmt man noch weitere Dimensionen hinzu wie vielleicht Farbe, Geschmack spricht man von Hyperebenen im Hyperraum. Für mehr als 3D gibt es wohl keine Begriffe mehr. Das kann man sich schlecht vorstellen, also bleibt man zur Veranschaulichung meist in 2D. Trotzdem kann man sich locker in 4,5 oder 6 Dimensionen (also Eingabewerte) bewegen.

Wenn man aber nun nicht mehr Eingabewerte als 2 hat und die Daten trotzdem durch ein Perzeptron schlecht separierbar sind, liegt es nahe, ein weiteres Perzeptron hinzuzunehmen und diese beiden zu verknüpfen. So kann man die beiden Trenngeraden der Perzeptrone so ausrichten , dass sie besser die Daten separieren.

Nehmen wir mal 3 Gearden also 3 Perzeptrone, diese 3 Geraden bilden ein Dreieck. Wir nehmen mal an sie sind nicht parallele. Man kann sich jetzt vorstellen dass alle Testdaten in diesem Dreieck einer Klasse angehören und alle anderen ausserhalb. Damit hätten wir schon unser Ziel der Klassifizierung erreicht. Natürlich kann die Problematik komplexer sein und die Daten lassen sich nicht von einem Dreieck eingrenzen, dann nimmt man weitere Perzeptrone um Vielecke zu bilden. Reicht das nicht und man findet in diesem Vieleck immernoch falsch klassifizierte Daten, kann man nun eine Neue Schicht Perzeptrone hinzufügen. Mit ihnen kann man dann auch definierte Vielecke,Dreiecke oder.... umklassifizieren, da man sie in der zweiten Schicht mit negativen Gewichten verknüpfen kann. So könnten in Dreieck 1 alle Daten gute sein, aber dafuer muessen sie ausserhalb des Dreiecks 2 sein. So arbeitet man sich schrittweise an die Lösung heran und umzingelt quasi die Daten.

Zum Glück muss man das nicht selber machen, dafür gibt es beispielweise den Backpropagationalgo. Auch die Netzarchitektur kann man bei komplexeren Problemen nicht vorhersehen, man nimmt einfach ein paar Schichten mit einigen Neuronen pro schicht und probiert ein bisschen. Es ist etwa wie Backen, man muss ein bisschen spielen um das passende Rezept zu finden.

reuabreliz
24.09.2009, 19:04
Hier das Bild sorry :S

yodakohl
27.09.2009, 20:35
Hallo zusammen. Ich arbeite derzeit an einem Netzsimulator in C++.

Mein Ziel ist es ein Programm zu entwerfen das einfach und autonom Netze für komplexe Anwendungen "züchtet"

Wie schon im Titel erwähnt beschreite ich dabei hinsichtlich der Lernfunktion ungewöhnliche Wege. Ich verzichte nämlich völlig darauf.

Zu Grunde liegt bei mir ein Neuronales Netz das Vollverbunden ist sowohl in vorwärts als auch in entgegengesetzter Richtung. Dadurch lässt sich ein zeitliches "Gedächtnis" realisieren

Wie lernt nun das Netz?

Ganz einfach: durch Mutation und Selektion. Eine Population von Standartnetzen wird auf eine Simulationswelt losgelassen. Die Gewichte sind rnd initialisiert.
Eine Fitnessfunktion ermittelt wie erfolgreich ein Netz ist.
Ist genügend Zeit vergangen werden schlechte Netze gelöscht, Erfolgreiche in mutierter Form vervielfältigt. Dabei werden sowohl Gewichte bzw. die Größe des Netzes geringfügig geändert.

Der ganze Prozess ist sehr zeitaufwändig, allerdings sollte sich ein sehr effizientes Netz herauskristallisieren, welches dann eventuell auf Hardware übertragen lässt.

Der eigentliche Sinn dahinter ist dass der Anwender nur Eingänge und Ausgänge, sowie die Fitnessfunktion anpassen muss, und automatisch gute Netze erhält

Was haltet ihr davon?
Bei Interesse gehe ich gerne auch auf Details ein

thewulf00
27.09.2009, 21:06
Vom Ansatz her klingt es phänomenal!
Würde gern mal Dein Programm in Aktion erleben, um gezeigt zu bekommen, ob Du die Anforderungen umsetzen konntest.

Netzman
27.09.2009, 21:27
Das klingt wirklich vielversprechend, mehr Infos erwünscht :)
Nach welchen Regeln mutierst du die Netze? Oder auch nach Zufall?

mfg

the.speciali
27.09.2009, 21:38
Hört sich tatsächlich sehr interessant an. Ist es möglich dein Programm irgendwo einzusehen oder herunterzuladen würde es gerne in Aktion erleben.

Auch würde mich interessieren wie die Simulationswelt aussieht. Außerdem: was verstehst du unter "zeitaufwändig"? Ich versteh darunter eine Simulationszeit von ein paar Stunden für jede neue Population, sehe ich das richtig?

Fragen über Fragen ich hoffe es ist nicht zuviel ;)

beste Grüße
the.speciali

yodakohl
27.09.2009, 22:06
Die Netze laufen derzeit in der einfachsten Umgebung die mir eingefallen ist. Sie besteht aus einer 2d Welt ohne Objekte, mit einer Lichtquelle. Die Mutation erfolgt derzeit nach Zufall, später will ich eine Art Rekombination zwischen den Netzen einführen, allerdings weiß ich nicht ob diese Variante zielführend ist.

Der Zeitaufwand ist abhängig von Populationsgröße sowie Netzgröße. Derzeit laufen 400 Netze gleichzeitig. Nach 1000 Netzschritten wird ausgewertet. Dafür werden etwa 40 Sekunden benötigt. Ein akzeptables Netz wird bei einfachen Aufgaben etwa nach 100 Populationen erreicht sein, damit liegt die Lernzeit im Minutenbereich. Allerdings kann es bei Schwierigen Aufgaben durchaus Stunden / Tage dauern, da die Netzgröße erheblich steigt.

Zum runterladen gibts das Programm noch nicht, da ich noch mit einigen Problemen zu kämpfen habe, und das Interface zur Zeit nur unter Linux läut

In einigen Tagen werde ich dann wohl so weit sein das erste Netz zu "züchten"


Dabei werden die Netze einen Lichtsensor, sowie einen Wärmesensor haben und versuchen mit 2 Aktoren zur "Sonne zu fahren"

gast1234
27.09.2009, 22:09
@yodakohl
Absatz 7.3 oben genanntes Skript

Es kommt darauf an, wie die Mutationsmechanismen funktionieren und die Mutabilität sich entwickelt und vererbt wird.

Wenn du einfach nur so einzelne Werte veränderst, wandelst Du mit linearen Schritten in einem nicht linearen Qualitätsgebirge. Mit jeder Zwischenschicht nimmt die Linearität ab, bzw. steigt die Exponentialität an. Deswegen gibts die Lösung des Optima-Findens im Backpropagation über eine nichtlineare Aktivierungsfunktion, dank vollständiger Stetigkeit und damit voll differenzierbar.

Die Rückkopplung verstärkt die nichtlineare Eigenschaft nochmals. Dem muß Rechnung getragen werden.

Falls das nicht verständlich ist, schaut Euch das Bild dieses Qualitätsgebirges an und stellt es Euch noch ein bisschen zackiger vor.
http://www.henrys.de/daniel/cmd/texte/diplomarbeit/kapitel3/2/Image193.gif
Quelle: http://www.henrys.de/daniel/index.php?cmd=texte_diplomarbeit_kapitel3_2_index. htm

Zum Verständniss ein kleines Netz mit 2 verdeckten Schichten mal per Hand ausrechnen, meinetwegen mit Excel und mutieren.

Habe ich das so richtig verstanden?

Hast Du eingentlich einen konreten Anwendungsfall für Dein Netz?
Bin gespannt auf Vorschläge :)

yodakohl
27.09.2009, 22:50
Meinst du das ich durch beliebige Mutation Gefahr laufe schon durch kleine Veränderungen direkt von einer guten Lösung in eine schlechte zu springen?
Abhilfe könnte hier die Wahl einer größeren Population schaffen. Hättest du einen besseren Vorschlag die Mutation durchzuführen? Ist es überhaupt möglich Gewichte durch traditionelle Lernvorgänge zu optimieren wenn der gewünschte Output nicht bekannt ist?



Konkrete Anwendungsfälle:

Grundsätzlich sollten mit genügend Zeit und Rechenleistung verschiedenste Anwendungen möglich sein.
Begrenzungen sehe ich derzeit nur durch die angebotene Simulationswelt und dem Erstellen einer geeigneten Fitnessfunktion (Wobei ich meinen Mund nicht zu weit aufreißen will, da ja immer wieder Netzmodelle als die eilegende Wollmilchsau gesehen wurden und sich dann als Enttäuschung herausstellten)



Beispiele wären:

Quellen finden (Licht, Feuer, Schall, usw)
Beinbewegung erlernen
Mustererkennung
Objekte auf einen Haufen schieben ...



Interessant wären die Möglichkeit durch entsprechende Inputs/Outputs eine einfache Kommunikation von Netzen zur Verfügung zu stellen
und ihnen Problemstellungen zu geben die Teamwork erfordern.

gast1234
27.09.2009, 23:28
Meinst du das ich durch beliebige Mutation Gefahr laufe schon durch kleine Veränderungen direkt von einer guten Lösung in eine schlechte zu springen?
Ja genau das meine ich, dadurch dass du selbstverstärkende Faktoren hast (Rückkopplung) und eine nicht lineare Natur, du hast ja mehrere Polynome, denkst Du vielleicht erst du änderst das Gewicht nur etwas, machst aber im Qualitätsgebirge ein großen Sprung. Große Populationen sind immer gut, von der Rechenzeit einmal abgesehen, lösen aber das Problem nicht. Ich habe leider auch mal versucht die Parameter verschiedener Differentialgleichungen durch Mutation und Crossing Over zu variieren, ich bin bei einem Maxima angekommen, aber bei weitem nicht das Globale.

Für diese Probleme gibt es Lösungen wurde mir gesagt, ich habe seit damals die Sache nicht mehr näher verfolgt, ich denke es ist nicht so schwer, aber meine Mathematikfähigkeiten degenerieren zunehmst ;)
Ich will Dich ermutigen das Problem zu verstehen und ein Lösung zu finden. Ich bin ebenfalls sehr interessiert und würde mich gerne belesen, wenn die Zeit es zulässt.

Ich glaube, man muss der Nichtlinearität in der Mutation Rechnung tragen, in der Fittnessfunktion befürchte ich, ist es zu spät.
Vielleicht spiele ich mal mit Excel um mir die Zusammenhänge nochmals zu verdeutlichen.

Im Skript sieht man diese Attraktoren, sehr nette Gebilde mathematischer Schönheit. Wie auch beschrieben konvergieren die Rückkopplungsnetze eventuell irgendwann, dann hättest du einen festen unveränderlichen Output, aber Attraktoren schwingen wenn ich es richtig verstehe. Damit bekommst du sich ständig verändernde Ergebnisse, die auch periodisch gleiche Werte annehmen können. Das wird ganz schön wuselig.

Lieber erstmal ein normales FeedForwardNetz versuchen zu optimieren per Mutation. Die rekursiven Netze rennen nicht weg.

Ich wünschte mein Mathewissen wäre besser. Ich bin nicht kompetent Dir eine Prognose zu geben, teile aber die Faszination an der Idee.

Arbeite dich mit wirklich kleinen Netzen ran, und lass den letzten Gedanken erstmal Zukunftsmusik sein. Ein bisschen träumen und spinnen darf man immer :) Das ist die Motivation.

gast1234
27.09.2009, 23:52
Das dürfte Dich interessieren:
http://www.heise.de/tp/r4/artikel/24/24696/1.html

http://www.sciencedirect.com/science?_ob=ArticleURL&_udi=B6VRT-4N3XDTT-5&_user=10&_rdoc=1&_fmt=&_orig=search&_sort=d&_docanchor=&view=c&_acct=C000050221&_version=1&_urlVersion=0&_userid=10&md5=46db83cabcbfd6ed63cce0d8bb36937b

kein Zwischenschichte, nur 10 Eingänge, 3 Ausgänge

rossir
29.09.2009, 00:31
Ich würde es erst mal einfach halten und nicht mit verpointerten Knoten und Kanten anfangen. Hier ein kleines NN das XOR berechnet:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {int depth; int layer[10]; double weight[30];} NN;
const double e=2.718281828459045, temperature=0.08;
#define sigmoid(x) (1.0/(1.0+pow(e, -x/temperature)))

double* evaluate(NN &net, double cell[]) {
int Weight=0, Out=0;

for (int level = 1; level < net.depth; level++) {
int In = Out;
Out += net.layer[level-1];
for (int j = 0; j < net.layer[level]; j++) {
double s = net.weight[Weight++]; // bias
for (int i = 0; i < net.layer[level-1]; i++) s += net.weight[Weight++] * cell[In+i];
cell[Out+j] = sigmoid(s);
}
}
return &cell[Out] ;
};

void xorNN(int a, int b) {
static NN net={3, /*layer*/ {2,2,1},
{/*inner1 node2 bias=*/-0.3, /*w0=*/+0.7, /*w1=*/-0.7,
/*inner1 node3 bias=*/-0.4, /*w0=*/-0.6, /*w1=*/+0.5,
/*outer2 node4 bias=*/-0.5, /*w2=*/+1.1, /*w3=*/+1.5,}};
double cell[2+2+1]={a,b};
printf("%d xor %d -> %d\n", a, b, evaluate(net, cell)[0]<0.5?0:1 );
}

int main(int argc, char* argv[]) {
xorNN(0,0);
xorNN(0,1);
xorNN(1,0);
xorNN(1,1);
}
Liefert als Ausgabe:

0 xor 0 -> 0
0 xor 1 -> 1
1 xor 0 -> 1
1 xor 1 -> 0

yodakohl
05.10.2009, 10:55
Ertse Tests sind erfolgreich verlaufen. Die Simulationsumgebung habe ich vereinfacht, die Nezte haben jetz nur mehr einen Input ( Helligkeit ). Als Aktivierungsfunktion bin ich jetzt auf die Sigmoidfunktion umgestiegen ( da ich auf negative Werte im Netz verzichte ). Interessanterweise hat erreicht das Netz bereits nach etwa 3 Generationen ein Maximum. Leider muss ich noch einen Fehler beseitigen ( Winkelberechnung ) um festzustellen ob es bereits das Globale Maximum ist.


Weiß jemand zufällig wie man Winkelberechnungen in c++ beschleunigen kann?

gast1234
25.10.2009, 10:20
Hey das ist super!

Vieleicht reichen zur Winkelberechnung auch Näherungswerte aus, dann könntest Du überlegen ob du eine vorherberechnete Tabelle verwendest. Das kann man relativ schnell testen. Und so eine Map ist schnell abgefragt.
Wüstenameisen berechnen zur Wegintegration auch kein Cosinus, sondern benutzen nur Näherungswerte.

.:Sebastian:.
25.10.2009, 19:39
Moin Moin ...

Ich hab vor einiger Zeit (1-2 Jahre) auch mal mit neuronalen Netzen gespielt.
Allerdings waren meine Ansätze zum Thema Lernen und Training einfach nur Müll.
Im Nachhinein verständlich weil mein Mathematisches Basiswissen große Lücken hatte.
(Nur mit Mittelstufenmathematik, tut man sich etwas schwer irgendwelche Maxima zu bestimmen. o.ä.)

Zum Thema Cosinus : Ich hatte auch schon ein zwei mal den Fall, dass die trigeometrischen Funktionen ein Perfomance-Engpass waren.
Meistens bringt dich da eine Wertetabelle weiter.

Allerdings ist mir gerade beim Lesen durch den Thread noch was anderes eingefallen.
Und zwar hat eigentlich sich schonmal jemand Gedanken gemacht ob man ein neuronales Netz nicht mit OpenCL-Unterstützung implementieren könnte ?
Also dass man quasi den rechenintensiven Teil auf eine Grafikkarte auslagert, ähnlich wie es manche Spiele mit der Physik machen.
Ich habe mich neulich mal in OpenCL eingelesen, (sehr schwere Kost, viele Specs, wenige grundlegende Beispiele ) eigentlich mehr zum Spaß, weil ich gelesen hab, dass ich meine neue Grafikkarte für GPU-Computing benutzen kann.
Dieser GPU-Ansatz taug ja immer für Situationen wo viele Werte parallel nach ähnlichen Schemata verrechnet werden. (Matrix-Rechenoperationen mit großen Matrizen).
Und gerade wenn man so ein Netz quasi Schichtweise abarbeitet, kann man zumindest was in der einen Schicht drin passiert parallelisieren.
(So wie ich das auf der ersten Seite verstanden hab)

Wie gesagt ich hab keine praktische Erfahrung mit neuronalen Netzen und auch nicht wirklich mit OpenCL und dem dazugehörigen Zeug.
Aber ich wollte einfach so mal eine Idee in den Raum stellen, vllt. is es ja als Ansatz brauchbar.

EDIT: Ziemlich viiiiiel später mir das aufgefallen http://www.codeproject.com/KB/graphics/GPUNN.aspx

Gruß
Sebastian

rossir
26.10.2009, 22:57
Ich habe gerade simbad aus dem Netz geladen. Das ist ein Roboter Simulator auf JAVA Basis. Verspricht somit auf vielen Plattformen lauffähig zu sein und ist unter meinem Windows XP extrem schnell und war dort simpelst zu installieren. Simbad ist ein 3D Robot Simulator sogar mit (kleiner) Physikengine und liegt (auch) im Quellcode vor.

Obendrein - und jetzt kommt's - gibt es optional und zusätzlich die Pakete piconode und picoevo. Mit piconode kann man NNs vielfältiger Art erzeugen und trainieren (z.B. via BP). Oder, man kann die NNs mittels picoevo evolvieren lassen um letztendlich das Verhalten des Roboters zu steuern (bzw. zu entwickeln). Also all das, was hier im Thread angesprochen wurde und vieles mehr.

Beispielcode ist vorhanden.

Ich tobe mich gerade mit simbad pur aus (also noch ohne piconode und picoevo) und bin begeistert davon wie realistisch mein Roboter in meiner Arena mit Hilfe eines Distanzsensors den Hindernissen in der Arena ausweicht.

yodakohl
16.11.2009, 16:38
So. Nach Studiumsstress hab ich fleißig weitergearbeitet.

Dabei habe ich das Programm komplett umstrukturiert, sodass es nun eine klare Trennung zwischen Neuronalem Netz und Simulationsumgebung herrscht. Leider gestaltet sich die Implementierung einer schönen und vorallem beliebig erweiterbaren Simulationsumgebung als schwieriger als gedacht. Vorallem die Implementierung von Aktoren ( Beine, Geißeln) wirft einige grundlegende Fragestellungen auf.

Leider ist der Code zu komplex um ihn in einem Forum zu posten (auch da er sich ständig ändert) Kennt jemand eine gute Möglichkeit ein Projekt übers Internet zu entwickeln?

@gast 1234. Danke für die Artikellinks, bin erstaunt was mit relativ kleinen Netzen möglich ist.

Nachdem ich mir Gedanken darüber gemacht wodurch ein Neuronales Netz definiert ist bin ich zu folgendem Schluss gekommen.

1. Jeder Eingang kann Einfluss auf jeden Ausgang haben
2. Durch Lernen kann jeder Eingang jeden Ausgang beliebig stark beeinflussen
(3). Ein Zeitabhängiges Element existiert
(4). Ein Element aus einer früheren Linie kann abhängig von einem Elemen aus einer späteren Linie sein ( Rückkopplung )

Punkt 3 und 4 sind bei nicht unbedingt notwendig

Das lässt eigentlich ziemlich viel Freiraum im Aufbau von Netzen
Nachdem ein klassisches Neuronales Netz aufgrund von Multiplikationen nur schwer Hardwaremäßig implementierbar ist werde ich (irgendwann) versuchen ein digitales Netz zu entwerfen, welches nur mit logischen Grundoperationen auskommt. Gibt es so etwas schon ? Hat schon jemand Erfahrungen damit?


Ich freue mich auch über Vorschläge für eventuelle Simulationsaufgaben (Licht folgen etc.) bzw über prinzipielle Vorschläge zur Simulationsumgebung

gertsch
19.11.2009, 21:22
Leider ist der Code zu komplex um ihn in einem Forum zu posten (auch da er sich ständig ändert) Kennt jemand eine gute Möglichkeit ein Projekt übers Internet zu entwickeln?

http://sourceforge.net/


over SVN

http://sourceforge.net/apps/trac/sourceforge/wiki/Subversion

is your coding friend.

mfg

Dirk123
16.12.2010, 15:41
Ich habe mich vor längerer Zeit auch mal mit der Materie befasst. Im Wesentlichen hatte ich zwei Projekte:
* Buchstabenerkennung: Definition aller Buchstaben, jeweils in einem 5x7-Pixel-Raster. Eingabe des Netzes waren dann die 5x7=35 Bits des zu erkennenden Buchstabens. Hier lässt sich wunderbar Backpropagation anwenden, da der Eingabe eine eindeutig richtige Antwort zugeordnet werden kann. Leider hatte ich nur mäßige Ergebnisse, weit entfernt von zuverlässiger Buchstabenerkennung ;-)
* Pacman: Ein neuronales Netz steuert den Gegner von Pacman durch ein einfaches Labyrinth um Pacman zu fangen. Dies habe ich mit Hilfe von Mutation/Selektion gemacht. Es hat deutlich besser geklappt als die Buchstabenerkennung. Auch hat man deutlich mehr Spaß dabei, die Lernfortschritte der Netze zu beobachten. Das Problem hierbei ist, dass man nicht eine einzelne Reaktion des NN auf eine Eingabe bewerten kann. Denn es braucht ja viele Schritte, um Pacman zu fangen. Ich habe also jedem Individuum 200 Schritte Zeit gegeben, Pacman zu fangen. Wer die geringste Entfernung zu Pacman hat, bzw. ihn in möglichst wenig Schritten gefangen hat, hat sich dupliziert. Die erfolglosesten Netze wurden verworfen.

linknik
16.12.2010, 16:17
Ich habe MemBrain verwendet kann man direkt in c++ code umwandeln lassen.http://www.membrain-nn.de/german/download_de.htm

yod4kohl
17.05.2011, 19:24
so lange ist her, hab sogar schon mein passwort vergessen... also original yodakohl. Ich habe nun das System auf eine 3d Umgebung umgebastelt eine physikengine dahintergeschnallt und einen kleinen 3d editor gebaut. Nach einer Gefühlten ewigkeit hab ich nun endlich ein erstes Ergebnis :)
http://www.youtube.com/watch?v=vVBS7fBhgB4

beny
21.05.2013, 15:34
Hi, ich habe eine frage , wie kann man überhaupt ein Trenngrade h rechnen?
ich habe 2 Netze (in Koordinaten System) und ich soll ein Trenngrade für beide Netze rechnen , mit den Augen kann man ein Lineare Trennung erkennen aber , ich soll das rechnen ...
danke