Problem: Eine Lesson laden mittels Membrain DLL

Haben Sie Fragen zur Bedienung bestimmter Features von MemBrain? Sind Sie nicht sicher, welches Häkchen was bewirkt? Möchten Sie wissen, ob eine bestimmte Funktionalität in MemBrain vorhanden ist oder nicht?

Dann stellen Sie Ihre Fragen hier!
student
Posts: 3
Joined: Thu 7. May 2009, 08:28

Problem: Eine Lesson laden mittels Membrain DLL

Post by student »

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.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by Admin »

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
Thomas Jetter
student
Posts: 3
Joined: Thu 7. May 2009, 08:28

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by student »

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
schnurpel
Posts: 24
Joined: Fri 25. Dec 2009, 20:15

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by schnurpel »

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!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by Admin »

schnurpel wrote:in der dokumentation finde ich da nur eine funktion bzgl. der activation (MB_ApplyInputAct).
aber das ist ja was anderes
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'.

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
schnurpel
Posts: 24
Joined: Fri 25. Dec 2009, 20:15

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by schnurpel »

>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
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by Admin »

schnurpel wrote:MB_ApplyInputAct(0, 0.899349197825109)
Ihr Verständnis ist da schon richtig, welche Fehlermeldung erscheint denn und mit welchem Wert kehrt die Funktion zurück?
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
schnurpel
Posts: 24
Joined: Fri 25. Dec 2009, 20:15

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by schnurpel »

Admin wrote:
schnurpel wrote:MB_ApplyInputAct(0, 0.899349197825109)
Ihr Verständnis ist da schon richtig, welche Fehlermeldung erscheint denn und mit welchem Wert kehrt die Funktion zurück?
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 machs in vb6, nicht unter excel.
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?
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by Admin »

schnurpel wrote:das interpretiere ich, daß die funktion korrekt ausgeführt wurde.
das stimmt, ja, die Aufrufe werden korrekt ausgeführt.
schnurpel wrote:aber für act kommt 0.5774.
Ö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:
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
schnurpel
Posts: 24
Joined: Fri 25. Dec 2009, 20:15

Re: Problem: Eine Lesson laden mittels Membrain DLL

Post by schnurpel »

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
Post Reply