Import von Netzen
Import von Netzen
Hallo Herr Jetter,
beim ausprobieren von MemBrain ist bei mir die Frage aufgekommen ob es eine Möglichkeit gibt ein Netz zu importieren, z.B. als csv-Datei?
Oder gibt es hier eine andere Möglichkeit?
Schon mal Danke und viele Grüße,
Daniel
beim ausprobieren von MemBrain ist bei mir die Frage aufgekommen ob es eine Möglichkeit gibt ein Netz zu importieren, z.B. als csv-Datei?
Oder gibt es hier eine andere Möglichkeit?
Schon mal Danke und viele Grüße,
Daniel
Re: Import von Netzen
Nein, eine eingebaute Möglichkeit hierzu gibt es nicht. Allerdings könnte man sich ein Script programmieren, das eini Datei einliest, und daraus ein Netz konstruiert. Z.B. unter Verwendung der NetEditor Scriptklasse, die es bei den Scriptbeispielen auf der Homepage gibt.
Wozu soll die Importfunktion denn dienen?
Wozu soll die Importfunktion denn dienen?
Thomas Jetter
Re: Import von Netzen
Ich hänge mich einfach mal an den Thread hier an, weil ich glaube, dass mein Thema ähnlich ist.
Ich stehe vor der Herausforderung, dass ich Netze dynamisch erzeugen und trainieren muss.
Diese Netze sind alle ähnlich bzw. Variationen einer bestimmten Netztopologie mit zusätzlichen In/Out Knoten.
Das grundsätzliche Netz kann im Designer entworfen und optimiert werden. Verstehe ich es richtig, dass es per Skript möglich ist, zur Laufzeit
Wie würde das Prozedere per Skript aussehen? Müsste dann auch dynamisch kompiliert werden oder wie funktioniert das?
Vielen Dank für die Hilfe!
Dirk
Ich stehe vor der Herausforderung, dass ich Netze dynamisch erzeugen und trainieren muss.
Diese Netze sind alle ähnlich bzw. Variationen einer bestimmten Netztopologie mit zusätzlichen In/Out Knoten.
Das grundsätzliche Netz kann im Designer entworfen und optimiert werden. Verstehe ich es richtig, dass es per Skript möglich ist, zur Laufzeit
- ein Netz zu erzeugen,
- dieses zu trainieren,
- das trainierte Netz zu speichern
- das trainierte und gespeicherte Netz wieder zu laden
- und natürlich das dann aktive Netz zur Berechnung zu nutzen?
Wie würde das Prozedere per Skript aussehen? Müsste dann auch dynamisch kompiliert werden oder wie funktioniert das?
Vielen Dank für die Hilfe!
Dirk
Re: Import von Netzen
Ja, das ist alles korrekt. Dazu gibt es auch schon einiges an Beispiel-Code. Z.B. gibt es als Teil der Script-Beispiele von der Homepage die Script-Klasse 'NetEditor' und ein kleines Demo-Programm, wie diese genutzt wird. Damit wird das Erzeugen von Netzen per Script vereinfacht.Dirk wrote:Verstehe ich es richtig, dass es per Skript möglich ist, zur Laufzeit
* ein Netz zu erzeugen,
* dieses zu trainieren,
* das trainierte Netz zu speichern
* das trainierte und gespeicherte Netz wieder zu laden
* und natürlich das dann aktive Netz zur Berechnung zu nutzen?
Es gibt prinzipiell die folgenden Möglichkeiten:Admin wrote:Das normale Vorgehen, soweit ich es verstanden habe, ist ja das designen und trainieren des Netzes, dann export nach C++ code und compilen in eine DLL, mit der dann gearbeitet wird.
1.) Export eines einzelnen Netzes in C Code und damit machen, was man will (z.B. auf einem Microcontroller laufen lassen, in eine eigene Anwendung oder Dll einbinden...). Das Netz ist dann allerdings im Code eingefroren, kann also nicht mehr nachtrainiert werden.
2.) Die MemBrain DLL in eine eigene Anwendung einbinden. Damit ein oder mehrere Netze laden und diese benutzen und/oder nachtrainieren.
3.) MemBrain über Scripting verwenden. Bzgl. der Funktionalitäten von MemBrain bietet das Scripting die größste Flexibilität, man kann damit eben auch neue Netze erzeugen. Auch kann man MemBrain mit einem Script als Parameter aufrufen und im Script dafür sorgen, dass MemBrain nach der Scriptausführung automatisch wieder beendet wird. Bei nicht zeitkritischen Dingen ist das durchaus eine Option. So könnte man z.B. zum Erzeugen oder modifizieren von Netzen MemBrain selbst mit einem Script aufrufen und die so erzeugten Netze dann in der eigenen Applikation mit der MemBrain Dll nutzen...
Das sind nur ein paar Möglichkeiten, sicher kann man sich für die konkrete Applikation noch mehr einfallen lassen.
Viele Grüße
Thomas Jetter
Re: Import von Netzen
Danke für die Antwort und entschuldige die späte Reaktion...
Der zweite Punkt ist glaube ich der interessanteste: Das Einbinden der Membrain DLL in unsere Application (VB .Net). Dazu gibt es ja einen Wrapper. Ich habe gerade einen Mini-Test durchgeführt und den Wrapper einmal eingebunden.Soweit ich das sehe, gibt es dort keine Funktionen, um ein Netz dynamisch aufzubauen und Synapsen etc hinzuzufügen.
Scripting wäre gefühlt ein Umweg, da ja durchs Scripting nur die DLL angesteuert wird, und das kann ich ja eigentlich direkt machen.
Denn eigentlich müssten ja alle Funktionen in der DLL vorhanden sein, denn der Designer steuert ja auch nur die DLL an, oder?
Wir haben hier ein wenig mit dem Designer rumgespielt und ein Netz gefunden, das unsere Aufgabe sehr schön löst. Insofern würden wir gerne MemBrain nutzen, sind uns aber wegen der dynamischen Erstellung der Netze noch unsicher.
Danke für die Hilfe!
Dirk
Der zweite Punkt ist glaube ich der interessanteste: Das Einbinden der Membrain DLL in unsere Application (VB .Net). Dazu gibt es ja einen Wrapper. Ich habe gerade einen Mini-Test durchgeführt und den Wrapper einmal eingebunden.Soweit ich das sehe, gibt es dort keine Funktionen, um ein Netz dynamisch aufzubauen und Synapsen etc hinzuzufügen.
Scripting wäre gefühlt ein Umweg, da ja durchs Scripting nur die DLL angesteuert wird, und das kann ich ja eigentlich direkt machen.
Denn eigentlich müssten ja alle Funktionen in der DLL vorhanden sein, denn der Designer steuert ja auch nur die DLL an, oder?
Wir haben hier ein wenig mit dem Designer rumgespielt und ein Netz gefunden, das unsere Aufgabe sehr schön löst. Insofern würden wir gerne MemBrain nutzen, sind uns aber wegen der dynamischen Erstellung der Netze noch unsicher.
Danke für die Hilfe!
Dirk
Re: Import von Netzen
Das ist korrekt, die DLL bietet diese Schnittstellen nicht.Dirk wrote:Ich habe gerade einen Mini-Test durchgeführt und den Wrapper einmal eingebunden.Soweit ich das sehe, gibt es dort keine Funktionen, um ein Netz dynamisch aufzubauen und Synapsen etc hinzuzufügen.
Scripting wäre gefühlt ein Umweg, da ja durchs Scripting nur die DLL angesteuert wird, und das kann ich ja eigentlich direkt machen.
Denn eigentlich müssten ja alle Funktionen in der DLL vorhanden sein, denn der Designer steuert ja auch nur die DLL an, oder?
Um das zu verstehen, muss man wissen, dass MemBrain aus SW-Architektursicht tatsächlich ein Monolith ist: MemBrain verwendet die DLL nicht selbst. Vielmehr ist die DLL ein Spin-Off von MemBrain und ist erst später auf entsprechende Bedarfsanfrage hin entstanden. Natürlich gibt es deutliche Gemeinsamkeiten im Quellcode, die Binaries sind aber vollkommen unabhängig voneinander und MemBrain lädt die MemBrain DLL selbst nicht.
Tatsächlich müsste das Interface der DLL um ein Vielfaches mächtiger sein, wenn die DLL alles unterstützen wollte, was man mit MemBrain machen und visualisieren kann.
Somit bleibt momentan als einzige Möglichkeit, Netze zu edititeren oder neu zu erzeugen, MemBrain selbst. Möchte man diesen Schritt automatisieren, so muss ein Skript (siehe oben) verwendet werden.
Damit wird die Einsetzbarkeit von MemBrain für Euch wohl im Wesentlichen davon abhängen, ob Ihr auf dem Zielsystem, auf dem die Netze automatisiert zur Laufzeit erzeugt bzw. modifiziert werden sollen, MemBrain installiert haben könnt bzw. wollt. Technisch sollte das kein Problem darstellen. Wenn Ihr aber eine Software erzeugen wollt, die bei Euren Kunden zur Laufzeit neue Netze generiert, ohne dass MemBrain installiert ist, so geht das momentan nicht.
Eine entsprechende Erweiterung der DLL ist technisch natürlich problemlos möglich, ist aber von mir momentan nicht geplant. Im Moment arbeite ich hauptsächlich an der Entwicklung eines Remote-Debuggers für das Skripting.
Eine Alternative wäre - je nach Aufgabenstellung - evtl auch, mehrere verschiedene Netzentwürfe vorzubereiten und durch die DLL zur Laufzeit zu laden. Trainieren, Abspeichern, Lessons erzeugen etc. kann man mit der DLL.
Viele Grüße,
Thomas Jetter
Re: Import von Netzen
Ah, jetzt wird ein Schuh draus
Jetzt ist auch klar, warum die Trennung in "Scripting" und "Einbinden der DLL".
Membrain beim Kunden zu installieren ist eher eine schlechte Möglichkeit. Obwohl es ggf eine Notlösung wäre... Mhh.
Kannst Du (können Sie?) eine grobe Einschäzung geben, wie lange das Einbauen von "Netze erstellen" in die DLL dauern würde und wann Du damit ungefähr anfangen willst? Auch wenn ich nichts versprechen (und entscheiden) kann, ggf. gäbe es eine Möglichkeit, einen Anreiz zur Höherpriorisierung der Entwicklung zu schaffen
Jetzt ist auch klar, warum die Trennung in "Scripting" und "Einbinden der DLL".
Membrain beim Kunden zu installieren ist eher eine schlechte Möglichkeit. Obwohl es ggf eine Notlösung wäre... Mhh.
Kannst Du (können Sie?) eine grobe Einschäzung geben, wie lange das Einbauen von "Netze erstellen" in die DLL dauern würde und wann Du damit ungefähr anfangen willst? Auch wenn ich nichts versprechen (und entscheiden) kann, ggf. gäbe es eine Möglichkeit, einen Anreiz zur Höherpriorisierung der Entwicklung zu schaffen
Re: Import von Netzen
Ich bin neu im Forum und weiß nicht, ob meine Fragen an anderer Stelle schon behandelt worden sind bzw. dort behandelt werden sollten.
Frage 1: Netze kann man als csv-Dateien exportieren. Warum kann man diese nicht im selben Format wieder einlesen? Mein Problem ist, dass ich viele Netze mit sehr vielen Inputs durchrechen möchte, und die interaktive Definition der Netze sehr zeitaufwendig ist.
Frage 2: Ich habe gelesen, dass man Netze ggf. als Script automatisch generieren kann. Hat zufällig jemand ein Programm geschrieben, dass csv-Netzdefinitionen in ein Script überführt, welches das Netzt dann wieder automatisch erzeugt.
Frage 3: Ob es sich bei den exportierten (oder zum Training importierten) csv-Dateien um echte (Zahlen mit Punkt, Trennung durch Komma) oder "deutsche" (Zahlen mit Komma, Trennung durch Semikolon) csv-Dateien handelt, hängt von der Ländereinstellung ab; wahrscheinlich, da Excel es so handhabt. Wenn man Daten mit einem Programm erzeugt (C/C++, Perl [wie ich]), dann haben Zahlen einen Punkt. Kann man nicht wenigsten beim Import angeben, ob es csv-Dateien der Form ".," oder ",;" sind.
Frage 4: Wenn ich es richtig verstanden habe, werden Eingabedaten (Eingabeschicht) je nach Aktivierungsfunktion auf das Intervall [0,1] bzw. [-1,1] umskaliert bzw. beschnitten. Warum muss das sein? Kann man nicht eine Option einführen, die die Eingabedaten unverändert lässt. Durch die Multiplikation mit den Gewichten zur nächsten Schicht werden die Eingabedaten dann doch ggf. beliebig klein.
Ich kenne MemBrain erst einen Tag. Scheint mir eine große Leistung zu sein! Dank an den Entwickler!
Ulrich
Frage 1: Netze kann man als csv-Dateien exportieren. Warum kann man diese nicht im selben Format wieder einlesen? Mein Problem ist, dass ich viele Netze mit sehr vielen Inputs durchrechen möchte, und die interaktive Definition der Netze sehr zeitaufwendig ist.
Frage 2: Ich habe gelesen, dass man Netze ggf. als Script automatisch generieren kann. Hat zufällig jemand ein Programm geschrieben, dass csv-Netzdefinitionen in ein Script überführt, welches das Netzt dann wieder automatisch erzeugt.
Frage 3: Ob es sich bei den exportierten (oder zum Training importierten) csv-Dateien um echte (Zahlen mit Punkt, Trennung durch Komma) oder "deutsche" (Zahlen mit Komma, Trennung durch Semikolon) csv-Dateien handelt, hängt von der Ländereinstellung ab; wahrscheinlich, da Excel es so handhabt. Wenn man Daten mit einem Programm erzeugt (C/C++, Perl [wie ich]), dann haben Zahlen einen Punkt. Kann man nicht wenigsten beim Import angeben, ob es csv-Dateien der Form ".," oder ",;" sind.
Frage 4: Wenn ich es richtig verstanden habe, werden Eingabedaten (Eingabeschicht) je nach Aktivierungsfunktion auf das Intervall [0,1] bzw. [-1,1] umskaliert bzw. beschnitten. Warum muss das sein? Kann man nicht eine Option einführen, die die Eingabedaten unverändert lässt. Durch die Multiplikation mit den Gewichten zur nächsten Schicht werden die Eingabedaten dann doch ggf. beliebig klein.
Ich kenne MemBrain erst einen Tag. Scheint mir eine große Leistung zu sein! Dank an den Entwickler!
Ulrich
Re: Import von Netzen
Ich verstehe nicht ganz, wie da eine CSV-Datei helfen würde. Diese müsste man ja auch wieder irgendwie zunächst erstellen.ulrich wrote:Frage 1: Netze kann man als csv-Dateien exportieren. Warum kann man diese nicht im selben Format wieder einlesen? Mein Problem ist, dass ich viele Netze mit sehr vielen Inputs durchrechen möchte, und die interaktive Definition der Netze sehr zeitaufwendig ist.
Dass es die Möglichkeit des Imports momentan nicht gibt, hat im Wesentlichen zwei Gründe:
1.) Bisher habe ich den Nutzen einer solchen Import-Funktion nicht sehr hoch eingeschätzt, der Implementierungs- und Test-Aufwand hierfür ist aber signifikant
2.) Der Export enthält u.U. nicht alle notwendigen Daten, er könnte eingeschränkt worden sein. Damit würde das Netz - wenn überhaupt rekonstruierbar - ein abweichendes Verhalten und/oder Format aufweisen.
Das ist ein Feature, das ich gerne auf die Liste der zukünftigen Verbesserungen nehmen werde.ulrich wrote:Kann man nicht wenigsten beim Import angeben, ob es csv-Dateien der Form ".," oder ",;" sind.
Auch hierüber werde ich noch einmal nachdenken. Ich vermute aber, dass dies einige Schwierigkeiten versursachen wird, z.B. im Zusammenhang mit Erstinitialisierungen von Links, Eskalations-Begrenzern, was die Gewichte von Links angeht etc. Auch würden einige Features so nicht mehr funktionieren, die auf einem bekannten internen Wertebereich basieren (z.B. Einfärbung der Neuronen, Fire Thresholds etc).ulrich wrote:Frage 4: Wenn ich es richtig verstanden habe, werden Eingabedaten (Eingabeschicht) je nach Aktivierungsfunktion auf das Intervall [0,1] bzw. [-1,1] umskaliert bzw. beschnitten. Warum muss das sein? Kann man nicht eine Option einführen, die die Eingabedaten unverändert lässt. Durch die Multiplikation mit den Gewichten zur nächsten Schicht werden die Eingabedaten dann doch ggf. beliebig klein.
Viele Grüße
Thomas Jetter