SOM-Import über DLL

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
Post Reply
madxzen
Posts: 4
Joined: Tue 12. Jun 2012, 19:42

SOM-Import über DLL

Post by madxzen »

Hallo,

ich möchte die Membrain-DLL nutzen, um in Metatrader4 mit künstlichen neuronalen Netzen arbeiten zu können. Das scheint auch zu funktionieren, allerdings nicht für Netze, welche ich über "competitive with momentum" trainiert habe. Die anderen Netze kann ich hingegen ganz einfach mit MB_LoadNet() importieren. Woran kann das liegen?

Danke euch
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: SOM-Import über DLL

Post by Admin »

Was passiert denn wenn Du ein solches Netz über die Dll zu laden versuchst, bzw. Woran siehst Du, dass es nicht funktioniert? Ggf. bitte ein Netz posten, so dass ich das Problem reproduzieren kann.

Viele Grüße
Thomas Jetter
madxzen
Posts: 4
Joined: Tue 12. Jun 2012, 19:42

Re: SOM-Import über DLL

Post by madxzen »

Hallo Thomas,

danke für die schnelle Antwort.
Dass es nicht funktioniert, sehe ich daran, dass mir die Funktion MB_LoadNet() (oder vielmehr __MB_LoadNet@4()) keine Null zurückschreibt. Das stünde ja dafür, dass es korrekt geladen worden ist. Anbei ein Beispielnetz.
Wo ich gerade dabei bin: gibt es eine Möglichkeit, auch die Gewichte der zu einem Output führenden Links via DLL zu eruieren? Wenn ich das richtig verstehe, dann repräsentieren diese ja quasi das Grundmuster, mit welchem die Inputs verglichen werden.

Vielen Dank nochmal,
madxzen
Attachments
SOM_MQ4.mbn
(38.46 KiB) Downloaded 748 times
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: SOM-Import über DLL

Post by Admin »

Hallo zurück,

also, das angehängte Netz ist mit der neuesten MemBrain-Version (04.00.00.00) erstellt worden. Meine Vermutung ist, dass die bei Dir verwendete dll eine ältere Versionsnummer hat (also 03.xx.xx.xx).
Mit der 04.00.00.00 hat sich das Dateiformat von MemBrain-Netzen verändert, da alle internen Berechnungen nun in 64-Bit verarbeitet und abgespeichert werden (früher an vielen Stellen noch 32 Bit).
Kann es sein, dass das andere Netz, das einwandfrei geladen wird, mit einer MemBrain Version 03.xx.xx.xx erstellt (und abgespeichert) wurde?

EInfach mal die Versionsnummer der dll abfragen (dll Funktion _MB_GetVersionInfo()) und prüfen...

Es kann gut sein, dass in Deinem C:\Windows\System32 oder auch C:\Windows\SysWOW64 Verzeichnis noch eine alte dll liegt, die von Deiner Applikation verwendet wird. Diese muss mit der neuen Dll aus dem MemBrain Installations-Verzeichnis ersetzt werden.

Löst das Dein Problem?

Viele Grüße,
Thomas
Thomas Jetter
madxzen
Posts: 4
Joined: Tue 12. Jun 2012, 19:42

Re: SOM-Import über DLL

Post by madxzen »

Hallo nochmal,

du hattest Recht, da hat sich noch eine alte Version der DLL versteckt. VIELEN Dank für die Hilfe!
Was meinst du zu der Frage mit den Links? Kann man deren Gewichte irgendwie auslesen?

Danke nochmal und Gruss,
madxzen

P.S.: grossen Respekt für die tolle Arbeit mit diesem Projekt!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: SOM-Import über DLL

Post by Admin »

madxzen wrote:Was meinst du zu der Frage mit den Links? Kann man deren Gewichte irgendwie auslesen?
Mit der dll ab 04.00.00.00 geht das, ja. Ob es Sinn macht, kann ich spontan nicht abschätzen, aber es geht.
Wenn Du Dir im dll header mal die folgenden Dinge ansiehst:
1.) Struktur für die Daten eines Links, da ist auch das Gewicht mit dabei:

Code: Select all

/// Parameter structure to describe link properties
typedef struct
{
    double weight;
    BOOL lockWeight;
    _MB_INT length;             // 1..10000
    BOOL displayWeight;

} SMBLinkProp;
2.) Dll Funktion zum auslesen dieser Struktur für den momentan selektierten Link (es muss genau einer selektiert sein):

Code: Select all

/// Get the properties of the selected link
MB_DLL_RETURN(EMBRetVal) _MB_GetSelectedLinkProp(SMBLinkProp* pProp);
3.) Dll Funktion, mit der man alle die Links selektieren kann, die von der EXTRA Selection zur normalen Selection führen:

Code: Select all

/// Select all links from Extra Selection to Selection
MB_DLL_RETURN(void) _MB_SelectFromExtra();
4.) Funktion, mit der man ein bestimmtes Inputneuron selektieren kann:

Code: Select all

/// Select an input neuron
MB_DLL_RETURN(EMBRetVal) _MB_SelectInput(_MB_INT InNeuronIdx, BOOL addToSelection);
5.) Funktion, mit der man die EXTRA Selection auf alle selektierten Neuronen setzt:

Code: Select all

/// Apply Extra Selection to the current selection
MB_DLL_RETURN(void) _MB_ExtraSelection();
6.) Funktion, mit der man ein bestimmtes Outputneuron selektieren kann:

Code: Select all

/// Select an output neuron
MB_DLL_RETURN(EMBRetVal) _MB_SelectOutput(_MB_INT OutNeuronIdx, BOOL addToSelection);
Wenn Du also die Schritte ab 4.) für ein bestimmtes Inputneuron und ein bestimmtes Outputneuron ausführst, dann die Funktion von 3.) benutzt, um den gewünschten Link zu selektieren und dann die Funktion von 2.) verwendest, um seine Properties zu lesen, dann hast Du das Gewicht.

Allerdings würde ich bei einer SOM eher nach dem Winner-Neuron nach einem Think Step suchen, anstatt über die Links zu gehen. Dieses bekommst Du mit

Code: Select all

/// Get index of the last output winner neuron of the net. Return -1 if unknown. Else
/// return the output neuron index of the winner neuron.
MB_DLL_RETURN(_MB_INT) _MB_GetOutputWinnerNeuron(void);
Viele Grüße
Thomas Jetter
madxzen
Posts: 4
Joined: Tue 12. Jun 2012, 19:42

Re: SOM-Import über DLL

Post by madxzen »

Phantastisch, funktioniert, herzlichsten Dank!
Post Reply