Und hier haben wir auch noch den Bösewicht gefunden, der Ihre Rückgabewerte anders macht:
' Get the number of neurons in a given hidden layer
Private Declare Function MB_GetHiddenCount Lib "MemBrainDll.dll" _
Alias "__MB_GetHiddenLayerCount@4" (ByVal hidLayerIdx As Long) As Long
Hier muss es __MB_GetHiddenCount@4 heißen.
Wered ich zeitnah in der Datei VBDeclarations.txt korrigieren, bitte vielmanls um Entschuldigung!
Achtung: Bitte auch vorigen Post dazu berücksichtigen, waren zwei Posts kurz hintereinander...
Gewichte speichern unter VB6
Re: Gewichte speichern unter VB6
Thomas Jetter
Re: Gewichte speichern unter VB6
Hallo Herr Jetter,
ich habe nach Ihrem Beispiel das Programm geändert.
Nachdem ich den Wert addToSelection auf false gesetzt habe im Aufruf MB_SelectAllUnresolved (ByVal addToSelection As Long)
funktionierte alles so wie es sollte.
Mich hat dort irritiert, das addToSelection Typ long und nicht bool sein sollte.
Also mein Programm erstellte jetzt völlig korrekt ein Netz, welches in MemBrain auch so angezeigt wie von VB6
erstellt wurde. also alles bestens.
Ich habe jetzt auch in der Function MB_GetHiddenCount Lib "MemBrainDll.dll" auf __MB_GetHiddenCount@4 geändert.
Eine Frage noch:
Wäre es möglich ein trainiertes Netz mit PHP zu nutzen?
Mir schebt etwa folgender Ablauf im Kopf rum.
Mit MemBrain wird ein Netz erstellt und trainiert.
Dann lade ich dieses Netz auf einen Web-Server hoch.
Über eine Funktion in PHP werden die Inputs des Netz gesetzt.
Dann führe ich einen Think_Step über PHP durch.
Dannach kann ich per PHP die Output-Daten auslesen und weiter verarbeiten.
Gibt es so etwas schon?
Liebe Grüße
Harald Berzins
ich habe nach Ihrem Beispiel das Programm geändert.
Nachdem ich den Wert addToSelection auf false gesetzt habe im Aufruf MB_SelectAllUnresolved (ByVal addToSelection As Long)
funktionierte alles so wie es sollte.
Mich hat dort irritiert, das addToSelection Typ long und nicht bool sein sollte.
Also mein Programm erstellte jetzt völlig korrekt ein Netz, welches in MemBrain auch so angezeigt wie von VB6
erstellt wurde. also alles bestens.
Ich habe jetzt auch in der Function MB_GetHiddenCount Lib "MemBrainDll.dll" auf __MB_GetHiddenCount@4 geändert.
Eine Frage noch:
Wäre es möglich ein trainiertes Netz mit PHP zu nutzen?
Mir schebt etwa folgender Ablauf im Kopf rum.
Mit MemBrain wird ein Netz erstellt und trainiert.
Dann lade ich dieses Netz auf einen Web-Server hoch.
Über eine Funktion in PHP werden die Inputs des Netz gesetzt.
Dann führe ich einen Think_Step über PHP durch.
Dannach kann ich per PHP die Output-Daten auslesen und weiter verarbeiten.
Gibt es so etwas schon?
Liebe Grüße
Harald Berzins
Re: Gewichte speichern unter VB6
Hallo Herr Berzins,
Man könnte also zumindest eine (selbstgeschriebene, kleine) Anwendung starten, der die Daten z.B. in Form einer Input-Datei übergeben werden und die beim Beenden eine Ergebnisdatei schreibt, die dann über PHP wieder zurückgelesen wird. Ob das die einzige mögliche Lösung und zudem die einfachste ist, will ich bezweifeln, ich halte den Weg aber durchaus für gangbar. Performant ist es natürlich auch nicht gerade, kommt also darauf an, welche Anforderungen hier vorliegen. Sicherlich kann man aus PHP heraus auch über Socket/TCP/IP Verbindungen mit einer auf dem Server laufenden eigenen Anwendung heraus kommunizieren. Das wäre bestimmt performanter und eleganter.
Wenn der Webserver eine Windowsmaschine ist, dann kann die aufgerufene Anwendung ja direkt die MemBrain dll nutzen, um mit dem Netz zu arbeiten. Das ist natürlich die flexibelste Lösung, das Netz lässt sich dann austauschen, ohne irgendetwas neu kompilieren/bauen zu müssen. Sogar ein Nachtrainieren aus der Serveranwendung heraus wäre möglich. Auf einer Linuxplattform müsste man entweder zu Wine greifen (sicherlich nicht schön und eher umständlich), oder aber den C-Code Generator von MemBrain nutzen und das Netz in die eigene externe Anwendung hineinkompilieren. Das ist zwar unproblematisch, erfordert aber für jede Änderung am Netz (z.B. nach erneutem Training) eine Neukompilierung des dann wieder neu generierten C-Codes. Auch ist ein Arbeiten mit mehreren unterschiedlichen Netzen so nicht möglich. Die dll kann das hingegen.
Letztendlich müsste man dazu einen PHP Programmierer befragen. Fertig gibt es das jedenfalls momentan nicht.
Viele Grüße
Von der Bedeutung/Semantik her ist es ein bool. Da es aber eine C-Methode ist, die da aufgerufen wird, wird ein 32 Bit Wert 0 oder 1 FALSE/TRUE erwartet (reines C kennt den Datentyp bool nicht). Möglich, dass die Signatur für VB dann falsch ist. Vielleicht möchten Sie kurz einmal Ihren funktionierenden Aufruf aus VBA heraus hier posten? Danke!Harald wrote: Wed 20. Feb 2019, 15:15 Mich hat dort irritiert, das addToSelection Typ long und nicht bool sein sollte.
Leider besitze ich keine PHP Kenntnisse. Ich weiß aber, dass es z.B. das PHP Kommando "system(...)" gibt (http://de2.php.net/manual/en/function.system.php), mit dem man auf einem Windows-Server eine exe Datei aus PHP heraus starten kann.Harald wrote: Wed 20. Feb 2019, 15:15 Eine Frage noch:
Wäre es möglich ein trainiertes Netz mit PHP zu nutzen?
Man könnte also zumindest eine (selbstgeschriebene, kleine) Anwendung starten, der die Daten z.B. in Form einer Input-Datei übergeben werden und die beim Beenden eine Ergebnisdatei schreibt, die dann über PHP wieder zurückgelesen wird. Ob das die einzige mögliche Lösung und zudem die einfachste ist, will ich bezweifeln, ich halte den Weg aber durchaus für gangbar. Performant ist es natürlich auch nicht gerade, kommt also darauf an, welche Anforderungen hier vorliegen. Sicherlich kann man aus PHP heraus auch über Socket/TCP/IP Verbindungen mit einer auf dem Server laufenden eigenen Anwendung heraus kommunizieren. Das wäre bestimmt performanter und eleganter.
Wenn der Webserver eine Windowsmaschine ist, dann kann die aufgerufene Anwendung ja direkt die MemBrain dll nutzen, um mit dem Netz zu arbeiten. Das ist natürlich die flexibelste Lösung, das Netz lässt sich dann austauschen, ohne irgendetwas neu kompilieren/bauen zu müssen. Sogar ein Nachtrainieren aus der Serveranwendung heraus wäre möglich. Auf einer Linuxplattform müsste man entweder zu Wine greifen (sicherlich nicht schön und eher umständlich), oder aber den C-Code Generator von MemBrain nutzen und das Netz in die eigene externe Anwendung hineinkompilieren. Das ist zwar unproblematisch, erfordert aber für jede Änderung am Netz (z.B. nach erneutem Training) eine Neukompilierung des dann wieder neu generierten C-Codes. Auch ist ein Arbeiten mit mehreren unterschiedlichen Netzen so nicht möglich. Die dll kann das hingegen.
Letztendlich müsste man dazu einen PHP Programmierer befragen. Fertig gibt es das jedenfalls momentan nicht.
Viele Grüße
Thomas Jetter
Re: Gewichte speichern unter VB6
Hallo Herr Jetter,
erstmal vielen Dank für die Infos mit der PHP Anbindung. Werde mal mit meinem Provider darüber sprechen.
Zur Zeit bin ich am verzeifeln!
Vielleicht können Sie mal auf mein Problem schauen.
Um mit der MemBrain.dll klar zu kommen baue ich mir einige Tests zusammen.
Jetzt habe ich mal eine kleine Bildverarbeitung gebastelt.
Eigentlich recht simpel.
Ein 300x300px Bild wird in 900 10x10px Teile segmentiert.
Mit den einzelnen Segmente erzeuge ich Pattern in einer Lesson.
Dann lasse ich trainiern.
Funktioniert alles gut.
Nun mein Problem
Zum Testen lade ich an die Input (100 Neuronen) des Netzes ein Segment des Bildes(10x10)
mit ret = MB_ApplyInputAct(i, Wert)
Funktioniert auch noch
Dann führe ich einen MB_ThinkStep durch.
Es liegen danach am Output zwar Werte vor, diese ändern sich aber nicht, egal wie oft ich einen MB_ThinkStep durchführe.
Ich lade immer neue Bildsegmente an den Input des Netzes, aber der Output ändert sich nicht.
Das Programm schein ordnungsgemäss zu funktioniern. Ich habe auch im Debugger sämtliche Ein- und Ausgaben kontrolliert. Schein alles in Ordnung zu sein.
Haben Sie eventuell ein Tipp für mich?
Liebe Grüße
Harald Berzins
erstmal vielen Dank für die Infos mit der PHP Anbindung. Werde mal mit meinem Provider darüber sprechen.
Zur Zeit bin ich am verzeifeln!
Vielleicht können Sie mal auf mein Problem schauen.
Um mit der MemBrain.dll klar zu kommen baue ich mir einige Tests zusammen.
Jetzt habe ich mal eine kleine Bildverarbeitung gebastelt.
Eigentlich recht simpel.
Ein 300x300px Bild wird in 900 10x10px Teile segmentiert.
Mit den einzelnen Segmente erzeuge ich Pattern in einer Lesson.
Dann lasse ich trainiern.
Funktioniert alles gut.
Nun mein Problem
Zum Testen lade ich an die Input (100 Neuronen) des Netzes ein Segment des Bildes(10x10)
mit ret = MB_ApplyInputAct(i, Wert)
Funktioniert auch noch
Dann führe ich einen MB_ThinkStep durch.
Es liegen danach am Output zwar Werte vor, diese ändern sich aber nicht, egal wie oft ich einen MB_ThinkStep durchführe.
Ich lade immer neue Bildsegmente an den Input des Netzes, aber der Output ändert sich nicht.
Das Programm schein ordnungsgemäss zu funktioniern. Ich habe auch im Debugger sämtliche Ein- und Ausgaben kontrolliert. Schein alles in Ordnung zu sein.
Haben Sie eventuell ein Tipp für mich?
Liebe Grüße
Harald Berzins
Re: Gewichte speichern unter VB6
Zunächst einmal ist es normal, dass sich bei einem zeitinvarianten Netz nur beim ersten ThinkStep nach dem Anlegen neuer Inputs etwas verändert: Das gesamte Netz wird über seine Inputs und seine internen Gewichte/Neuronen/Links im Zustand definiert. Dieser Endzustand ist nach dem ersten ThinkStep bereits erreicht. Erst wenn andere Inputs angelegt werden und ein erneuter ThinkStep durchgeführt wird, wird sich der Output (ggf) wieder ändern.TJetter wrote: Wed 20. Feb 2019, 19:25 Es liegen danach am Output zwar Werte vor, diese ändern sich aber nicht, egal wie oft ich einen MB_ThinkStep durchführe.
Ich lade immer neue Bildsegmente an den Input des Netzes, aber der Output ändert sich nicht.
Also:
1.) ApplyInputAct(...)
2.) ThinkStep
3.) GetOutputAct(...)
Wenn das so bei Ihnen nicht funktioniert, dann läuft vielleicht beim Anlegen der Muster etwas falsch? Sie schreiben, Sie verwenden eine Lesson. Dann können Sie ganze EIngangsmuster viel eleganter über die folgenden dll Schnittstellen an das Netzanlegen:
- Pattern auswählen:
' Select the currently active pattern of the currently active lesson
Private Declare Function MB_SelectPattern Lib "MemBrainDll.dll" _
Alias "__MB_SelectPattern@4" (ByVal idx As Long) As Long
- Das ausgewählte Pattern an die INputs anlegen
' Apply the currently active pattern to the inputs of the currently active net
Private Declare Function MB_ApplyPattern Lib "MemBrainDll.dll" _
Alias "__MB_ApplyPattern@0" () As Long
- Jetzt ThinkStep und dann GetOutputAct(...)
--> Wenn es immer noch nicht funktioniert, dann em besten einen Codeschnipsel posten und idealerweise Netz und Lesson anhängen oder per PN oder Mail an mich.
Viele Grüße
Thomas Jetter
Re: Gewichte speichern unter VB6
Hiemit möchte ich ich vielmals bei Herrn Jetter bedanken.
Durch einige PM konnte das Problem umfangreich gelöst werden.
In diesem Sinne
Harald
Durch einige PM konnte das Problem umfangreich gelöst werden.
In diesem Sinne
Harald
Re: Gewichte speichern unter VB6
Vielleicht wäre es für die Zukunft sehr hilfreich, wenn es ein Beschreibung der DLL mit jeweils einigen kleinen Code-Beispielen gäbe. So kann man sich als Einsteiger schneller in die DLL einarbeiten und muss nicht so viel rum probieren.