Problem: Eine Lesson laden mittels Membrain DLL
Problem: Eine Lesson laden mittels Membrain DLL
Edit: Dieses Problem hat sich erledigt. Hab den Weg über die NICHT RAW-CSV Dateien genommen.
Guten Tag,
ich programmiere in C und verwende die Membrain DLL. Bisher habe ich in meinem Code
das Netz geladen (_MB_LoadNet("NN Mantel.mbn")) ein Reset ausgeführt (_MB_ResetNet())
ein Teacher-File geladen (_MB_LoadTeacherFile("Teachers.mbt")) und mit _MB_GetTeacherCount()
überprüft ob dieser geladen wurde. Soweit ist alles in Ordnung.
Wenn ich allerdings nun eine Lesson laden möchte (_MB_ImportLessonRaw("lesson.csv")) dann
bekomme ich als Rückgabewert immer "-1".
Gibt es irgendwo eine Liste mit Fehlercodes für diese Funktion?
lesson.csv ist im gleichen Ordner wie die anderen Quelldateien!
lesson.csv wurde mit Membrain erstellt und über "Export Current Lesson(RAW CSV)"
exportiert.
Ich gehe davon aus dass der Rückgabewert "-1" bedeutet dass die Datei angeblich nicht gefunden wurde
oder?
Wenn ich anschliessend _MB_TeachStep() ausführe kommt als Rückgabewert "4", was laut
"Membrain_inc.h" "The net is not in sync with the lesson" heissen soll.
Freue mich über jede Art der Aufklärung.
Mit freundlichen Grüßen,
der Student.[/size]
Nachtrag: Wenn ich "nicht RAW" sondern normal CSV-Dateien verwende kann ich die Lesson laden. Aber schöner wäre es bei mir
wenn ich die RAW CSV-Datei verwenden könnte.
Guten Tag,
ich programmiere in C und verwende die Membrain DLL. Bisher habe ich in meinem Code
das Netz geladen (_MB_LoadNet("NN Mantel.mbn")) ein Reset ausgeführt (_MB_ResetNet())
ein Teacher-File geladen (_MB_LoadTeacherFile("Teachers.mbt")) und mit _MB_GetTeacherCount()
überprüft ob dieser geladen wurde. Soweit ist alles in Ordnung.
Wenn ich allerdings nun eine Lesson laden möchte (_MB_ImportLessonRaw("lesson.csv")) dann
bekomme ich als Rückgabewert immer "-1".
Gibt es irgendwo eine Liste mit Fehlercodes für diese Funktion?
lesson.csv ist im gleichen Ordner wie die anderen Quelldateien!
lesson.csv wurde mit Membrain erstellt und über "Export Current Lesson(RAW CSV)"
exportiert.
Ich gehe davon aus dass der Rückgabewert "-1" bedeutet dass die Datei angeblich nicht gefunden wurde
oder?
Wenn ich anschliessend _MB_TeachStep() ausführe kommt als Rückgabewert "4", was laut
"Membrain_inc.h" "The net is not in sync with the lesson" heissen soll.
Freue mich über jede Art der Aufklärung.
Mit freundlichen Grüßen,
der Student.[/size]
Nachtrag: Wenn ich "nicht RAW" sondern normal CSV-Dateien verwende kann ich die Lesson laden. Aber schöner wäre es bei mir
wenn ich die RAW CSV-Datei verwenden könnte.
Re: Problem: Eine Lesson laden mittels Membrain DLL
Hallo Student,
beim Import von Roh-CSV Dateien kann MemBrain nicht wissen, wie die Aufteilung Inputs/Outputs beim Einlesen der Datei sein soll. In MemBrain selbst muss man deshalb vor dem Import einer Roh-CSV Datei die Anzahl Inputs/Outputs im Lesson Editor korrekt einstellen. MemBrain orientiert sich dann beim Import an der Im Lesson-Editor eingestellten Anzahl Inputs und Outputs.
Mit der DLL verhält es sich genau so:
Entweder man stellt die Anzahl Inputs und Outputs vor dem Import manuell ein (_MB_SetLessonInputCount bzw. _MB_SetLessonOutputCount) oder aber man hat bereits ein Netz geladen, dass die korrekte Anzahl Inputs/Outputs hat und führt dann '_MB_NamesFromNet' aus.
Danach klappt auch der Import.
Wenn es dann beim Teach immer noch Probleme gibt, dann bedeutet das, dass das Netz andere I/O Namen hat wie die importierte Lesson (die Namen der I/Os werden ebenfalls aus der Roh-CSV Datei gelesen, nämlich aus der ersten Zeile).
Da hilft widerum an anschließendes _MB_NamesFromNet oder _MB_NamesToNet, je nachdem, was man anpassen will, das Netz oder die Lesson.
Hier ist aber Vorsicht geboten: MemBrain macht die Nameszuweisung Anhand der Reihenfolge der Neuronen im Netz und im Lesson-Editor. Im Lesson Editor geht MemBrain (bzw. die DLL) einfach von links nach rechts vor, jweils getrennt für Inputs und Outputs. Im Netz bestimmt sich die Reihenfolge ebenfalls von links nach rechts. Wenn aber mehrere Zeilen von Input- oder Output-Neuronen im Netz da sind, dann geht MemBrain zeilenweise von links nach rechts und von oben nach unten vor.
Helfen diese Infos?
Viele Grüße
beim Import von Roh-CSV Dateien kann MemBrain nicht wissen, wie die Aufteilung Inputs/Outputs beim Einlesen der Datei sein soll. In MemBrain selbst muss man deshalb vor dem Import einer Roh-CSV Datei die Anzahl Inputs/Outputs im Lesson Editor korrekt einstellen. MemBrain orientiert sich dann beim Import an der Im Lesson-Editor eingestellten Anzahl Inputs und Outputs.
Mit der DLL verhält es sich genau so:
Entweder man stellt die Anzahl Inputs und Outputs vor dem Import manuell ein (_MB_SetLessonInputCount bzw. _MB_SetLessonOutputCount) oder aber man hat bereits ein Netz geladen, dass die korrekte Anzahl Inputs/Outputs hat und führt dann '_MB_NamesFromNet' aus.
Danach klappt auch der Import.
Wenn es dann beim Teach immer noch Probleme gibt, dann bedeutet das, dass das Netz andere I/O Namen hat wie die importierte Lesson (die Namen der I/Os werden ebenfalls aus der Roh-CSV Datei gelesen, nämlich aus der ersten Zeile).
Da hilft widerum an anschließendes _MB_NamesFromNet oder _MB_NamesToNet, je nachdem, was man anpassen will, das Netz oder die Lesson.
Hier ist aber Vorsicht geboten: MemBrain macht die Nameszuweisung Anhand der Reihenfolge der Neuronen im Netz und im Lesson-Editor. Im Lesson Editor geht MemBrain (bzw. die DLL) einfach von links nach rechts vor, jweils getrennt für Inputs und Outputs. Im Netz bestimmt sich die Reihenfolge ebenfalls von links nach rechts. Wenn aber mehrere Zeilen von Input- oder Output-Neuronen im Netz da sind, dann geht MemBrain zeilenweise von links nach rechts und von oben nach unten vor.
Helfen diese Infos?
Viele Grüße
Thomas Jetter
Re: Problem: Eine Lesson laden mittels Membrain DLL
Vielen Dank für die ausführliche Beschreibung.
Da ich nun den Weg über die "normalen" CSV-Dateien genommen habe
hat sich das nun erledigt.
Mit freundlichen Grüßen
ein Student
Da ich nun den Weg über die "normalen" CSV-Dateien genommen habe
hat sich das nun erledigt.
Mit freundlichen Grüßen
ein Student
Re: Problem: Eine Lesson laden mittels Membrain DLL
da es in meiner frage auch um die dll geht, poste ich es mal hier hinein:
wie kann ich mittels vb einem input neuron an die dll einen startwert übergeben?
in der dokumentation finde ich da nur eine funktion bzgl. der activation (MB_ApplyInputAct).
aber das ist ja was anderes.
oder geht das nur über das lesson handling?
ich würde aber gerne direkt in einzelne neuronen schreiben.
danke!
wie kann ich mittels vb einem input neuron an die dll einen startwert übergeben?
in der dokumentation finde ich da nur eine funktion bzgl. der activation (MB_ApplyInputAct).
aber das ist ja was anderes.
oder geht das nur über das lesson handling?
ich würde aber gerne direkt in einzelne neuronen schreiben.
danke!
Re: Problem: Eine Lesson laden mittels Membrain DLL
Nein, das ist schon genau die richtige Funktion. Wenn Sie einen EIngangswert an ein Eingangsneuron anlegen, dann übernimmt es diesen Als 'Aktivierung' bzw. 'Activation'.schnurpel wrote:in der dokumentation finde ich da nur eine funktion bzgl. der activation (MB_ApplyInputAct).
aber das ist ja was anderes
Die Dll bietet dazu die Funktion 'MB_ApplyInputAct'.
Als Hintergrund dazu:
Wenn in MemBrain ein Eingangsneuron erstellt wird, dann wird für den Parameter 'Activation Sustain Factor' automatisch eine '1' eingetragen.
Dieser Faktor 1 sogt dafür, dass ein Eingangsneuron seine Aktivierung beibehält, auch wenn ein 'Think Step' durchgeführt wird. Es hält also quasi den zuletzt angelegten EIngangswert als Aktivierung fest.
Sie können spasseshalber einmal bei einem Eingangsneuron den 'Activation Sustain Factor' auf einen Wert < 1 setzen, z.B. 0.98. Weisen Sie dem Neuron eine Anfangsaktivität zu, entweder durch Eintragen im Eigenschaftendialog oder in dem Sie das Neuron markieren und dann die Taste '1' auf Ihrer Tastatur drücken.
Wenn Sie jetzt Think Steps durchführen, dann werden Sie sehen, dass das betreffende Eingangsneuron, beginnend mit dem zweiten Think Step, kontinuierlich an Aktivität verliert.
Damit lassen sich also auch Netze bauen, an die nur ab und an (z.B. alle paar Think Steps) ein Eingangsmuster angelegt wird und die zwischen den Mustern mit abklingenden Eingangsmustern arbeiten. So kann man beispielsweise mit einem relativ kleinen Satz an Eingangsmustern viele Trainingsmuster gewinnen, die durch Abklingen entstehen. Das kann z.B. bei der Bilderkennung sinnvoll sein, weil das selbe Bild automatisch mit variablem Kontrast trainiert wird.
Prinzipieller Hinweis:
Im Gegensatz zum Scripting arbeitet die Dll durchgehend mit 0-basierten Indizes! Das gilt für alle Indizes, egal ob es um Zugriff auf Lessons oder Neuronen geht.
Ich habe für das Skripting das 1-basierte Indizieren eingeführt, damit die Indizes sich mit den in der MemBrain Oberfläche angezeigten decken (z.B. beim Auswählen der aktiven Lesson oder dem aktiven Pattern). Im Prinzip bereue ich diese Entscheidung ein wenig, da beim Programmieren in C/C++ und damit auch in AngelScript das 0-basierte Indizieren üblich und durchgehend schöner ist.
Ändern werde ich diese jedoch nicht mehr, man muss sich also immer des Unterschieds in der Indizierung zwischen Skripten und Dll bewusst sein!
Viele Grüße
Thomas Jetter
Re: Problem: Eine Lesson laden mittels Membrain DLL
>Nein, das ist schon genau die richtige Funktion. Wenn Sie einen EIngangswert an ein Eingangsneuron anlegen, dann übernimmt es diesen Als 'Aktivierung' bzw. 'Activation'.
Die Dll bietet dazu die Funktion 'MB_ApplyInputAct'.
ok, aber wie ist da die syntax?
nach meinem verständnis müßte es heißen
MB_ApplyInputAct(0, 0.899349197825109)
also dem input-neuron 0 wird der wert 0.899... zugewiesen.
aber das gibt ne fehlerneldung.
was ist falsch?
vg,
mk
Die Dll bietet dazu die Funktion 'MB_ApplyInputAct'.
ok, aber wie ist da die syntax?
nach meinem verständnis müßte es heißen
MB_ApplyInputAct(0, 0.899349197825109)
also dem input-neuron 0 wird der wert 0.899... zugewiesen.
aber das gibt ne fehlerneldung.
was ist falsch?
vg,
mk
Re: Problem: Eine Lesson laden mittels Membrain DLL
Ihr Verständnis ist da schon richtig, welche Fehlermeldung erscheint denn und mit welchem Wert kehrt die Funktion zurück?schnurpel wrote:MB_ApplyInputAct(0, 0.899349197825109)
Wird sie denn überhaupt aufgerufen?
In welcher Excel-Version programmieren Sie denn? Haben Sie dementsprechend ggf. alle Deklarationen angepasst ('Long' durch 'Integer' ersetzt) wie in der 'VBDeclarations.txt' angegeben? Haben Sie die dll in Ihr C:\Windows\System32 Verzeichnis kopiert?
Viele Grüße
Thomas Jetter
Re: Problem: Eine Lesson laden mittels Membrain DLL
ich machs in vb6, nicht unter excel.Admin wrote:Ihr Verständnis ist da schon richtig, welche Fehlermeldung erscheint denn und mit welchem Wert kehrt die Funktion zurück?schnurpel wrote:MB_ApplyInputAct(0, 0.899349197825109)
Wird sie denn überhaupt aufgerufen?
In welcher Excel-Version programmieren Sie denn? Haben Sie dementsprechend ggf. alle Deklarationen angepasst ('Long' durch 'Integer' ersetzt) wie in der 'VBDeclarations.txt' angegeben? Haben Sie die dll in Ihr C:\Windows\System32 Verzeichnis kopiert?
Viele Grüße
ich kann auch die dll ansprechen und ein netz laden.
wenn ich folgende zeilen eingebe:
ret = MB_GetInputAct(0, act)
ret1 = MB_ApplyInputAct(0, 0.899349197825109)
ret2 = MB_GetInputAct(0, act2)
kommt für ret immer der wert 0.
das interpretiere ich, daß die funktion korrekt ausgeführt wurde.
aber für act kommt 0.5774. der müßte doch 0 sein, denn das netz ist ja leer,ich habe noch keinen input-wert vergeben.
für act2 kommt dann korrekt 0.899349197825109, den wert, den ich vorher reingeschrieben habe.
vielleicht haben wir uns aber auch mißverstanden.
ich möchte ja nicht den activation wert des input neurons verändern, (den hat das netz ja zuvor "gelernt"), sondern ich möchte den input datenwert explizit verändern.
also 0.89 oder 2130 oder 44, etc.
und so wie ich das sehe, geht das nur über lessons und nicht direkt mithilfe einer funktion. oder lieg ich jetzt total daneben?
Re: Problem: Eine Lesson laden mittels Membrain DLL
das stimmt, ja, die Aufrufe werden korrekt ausgeführt.schnurpel wrote:das interpretiere ich, daß die funktion korrekt ausgeführt wurde.
Öffnen Sie das Netz in MemBrain, Doppelklicken Sie auf das erste Input Neuron und schauen nach, welche Aktivierung es hat. Es sollte genau 0.5774 haben:schnurpel wrote:aber für act kommt 0.5774.
MemBrain speichert das Netz immer mitsamt allen Momentanwerten ab, das beinhaltet auch die momentanen Aktivierungen. Bei zeitinvarianten Netzen spielt das natürlich keine große Rolle, da sich die Outputs immer nur aus den momentanen INputs ergeben und man die in der Regel immer anlegt bevor man einen ThinkStep durchführt.
Bei zeitvarianten Netzen sieht das aber schon anders aus: Hier spielt der momentane interne Netzzustand eine Rolle für den nächsten Ausgangswert.
Deshalb wird das Netz immer in genau dem Zustand abgespeichert, den es momentan hat.
Wenn Sie das Netz nach dem Laden zunächst einmal zurücksetzen wollen (was Sie aber nicht tun müssen), dann gibt es dafür die Funktion MB_ResetNet: Sie setzt alle AKtivitäten auf 0, wobei mit '0' hier die interne AKtivität der Neuronen ohne Normalisierung gemeint ist. Haben Sie eine bestimmte Normalisierung eingestellt, dann nimmt das Neuron den Wert ein, dem die interne '0' entspricht (also z.B. den Minimalwert der Normalsierungsgrenzen).
Admin wrote:vielleicht haben wir uns aber auch mißverstanden.
ich möchte ja nicht den activation wert des input neurons verändern, (den hat das netz ja zuvor "gelernt"), sondern ich möchte den input datenwert explizit verändern.
also 0.89 oder 2130 oder 44, etc.
Nein, nein, wir haben uns nicht missverstanden. Die Funktion tut genau das was Sie möchten: Sie legt den angegebenen Wert als neue Aktivierung an das Eingangsneuron an (also als Input-Wert, für den Sie den Netzoutput berechnen wollen). Wenn Sie das für alle Input-Neuronen tun und dann einen ThinkStep (MB_ThinkStep) ausführen, dann können Sie von den Ausgangsneuronen das Netzergebnis ablesen (MB_GetOutputAct).
Klärt das die Fragen?
Viele Grüße
Thomas Jetter
Re: Problem: Eine Lesson laden mittels Membrain DLL
ja, damit ist fast alles geklärt, vielen dank!
aber worin liegt der unterschied zwischen
MB_GetOutputAct
und
MB_GetOutputOut
es werden die gleichen werte zurückgegeben.
ich hab jetzt folgendes eingesetzt:
Dim ret As Integer
Dim out0, out1 As Double
ret = MB_GetOutputAct(0, out0)
ret = MB_GetOutputAct(1, out1)
komischerweise kommt jetzt bei der abarbeitung von MB_GetOutputAct(0, out0) eine unterbrechung mit überlauf-fehler.
wird das programm dann trotzdem fortgesetzt, kommt in der nächsten (fast identischen zeile) dieser fehler nicht und in beiden(!) werten out0 und out1 stehen die richtigen werte!
was ist hier faul?
ich hab das hier vorerst so gelöst, daß ich bei einem error einfach noch mal abfrage, aber elegant ist das natürlich nicht
vg,
mk
aber worin liegt der unterschied zwischen
MB_GetOutputAct
und
MB_GetOutputOut
es werden die gleichen werte zurückgegeben.
ich hab jetzt folgendes eingesetzt:
Dim ret As Integer
Dim out0, out1 As Double
ret = MB_GetOutputAct(0, out0)
ret = MB_GetOutputAct(1, out1)
komischerweise kommt jetzt bei der abarbeitung von MB_GetOutputAct(0, out0) eine unterbrechung mit überlauf-fehler.
wird das programm dann trotzdem fortgesetzt, kommt in der nächsten (fast identischen zeile) dieser fehler nicht und in beiden(!) werten out0 und out1 stehen die richtigen werte!
was ist hier faul?
ich hab das hier vorerst so gelöst, daß ich bei einem error einfach noch mal abfrage, aber elegant ist das natürlich nicht
vg,
mk