Gewichte speichern unter VB6

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!
Harald
Posts: 11
Joined: Mon 11. Feb 2019, 11:06

Gewichte speichern unter VB6

Post by Harald » Mon 18. Feb 2019, 16:24

Hallo,

wurschtel mich gerade durch die DLL-Befehle.
Soweit alles gut.
Unter VB6 lade ich ein Netz, Trainiere es und kann es so auch gut nutzen.

Nun möchte ich die ermittelten Gewichte speichern, so das ich bei einem Neustart des Programms die gelernten Gewichte zur Verfügung habe.
Ich finde jedoch keinen Befehl die Gewichte zuspeichern.
Kann mir jemand einen Tipp geben wie ich die Gewichte speichern kann.

Noch eine Frage: Wie erstelle ich einen BIAS?

Viellen Dank im Vorraus

Harald

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Gewichte speichern unter VB6

Post by TJetter » Mon 18. Feb 2019, 19:10

Hallo,
Harald wrote:
Mon 18. Feb 2019, 16:24
Kann mir jemand einen Tipp geben wie ich die Gewichte speichern kann.
Dazu gibt es die beiden Funktionen MB_SaveNetAs und MB_SaveNet :

' Save a MemBrain neural net to the given *.mbn file (including path)
Private Declare Function MB_SaveNetAs Lib "MemBrainDll.dll" _
Alias "__MB_SaveNetAs@4" (ByVal fileName As String) As Long

' Save an already loaded MemBrain neural net (overwrite original file)
Private Declare Function MB_SaveNet Lib "MemBrainDll.dll" _
Alias "__MB_SaveNet@0" () As Long

Diese speichern das gesamte Netz - und damit auch alle Gewichte, Aktivitäten usw. - ab. Funktionieren also exakt wie die entsprechenden Menüpunkte in MemBrain selbst.

Viele Grüße
Thomas Jetter

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Gewichte speichern unter VB6

Post by TJetter » Mon 18. Feb 2019, 19:19

Harald wrote:
Mon 18. Feb 2019, 16:24
Noch eine Frage: Wie erstelle ich einen BIAS?
Jedes Neuron in MemBrain hat automatisch einen 'BIAS', nämlich in Form seiner 'Activation Threshold'.
In MemBrain kann man diese Schwelle direkt über die GUI für jedes Neuron manuell festsetzen, sie wird aber beim Training des Netzes natürlich wie alle anderen Gewichte verändert, wenn man dies nicht sperrt (= Haken bei 'Lock Act. Thres. for Teacher' im Properties-Dialog für das Neuron).
Die 'Activation Threshold' verhält sich wie ein negatives Gewicht zu einem On-Neuron. Eine Activation Threshold von 0.5 wirkt also wie ein Gewicht von -0.5 zu einem On-Neuron. Ist also nur eine Frage der Darstellungsart/Bezeichnung.

Über die dll lassen sich alle Eigenschaften der Neuronen gezielt beeinflussen, wenn man dies denn tun möchte. Das geschieht über die Schnittstelle:

' Set the properties of the selected neurons
Private Declare Function MB_SetSelectedNeuronProp Lib "MemBrainDll.dll" _
Alias "__MB_SetSelectedNeuronProp@4" (ByRef prop As NeuronProp) As Long

' Properties of a Neuron
Private Type NeuronProp
act As Double
actFunc As Long ' see const definitions below
actThres As Double
lockActThres As Long
actSustain As Double ' 0..1
outputFireLevel As Long ' see const definitions below
outputRecovTime As Long ' 1..100000
fireThresLow As Double ' fireThresHi must be >= fireThresLo
fireThresHi As Double ' fireThresHi must be >= fireThresLo
useNormalization As Long
normRangeLow As Double
normRangeHigh As Double
useActIgnoreVal As Long
actIgnoreVal As Double
expLogistic As Double
parmTanHyp As Double
allowTeacherOutputConnect As Long
displayName As Long
displayAct As Long
isPixel As Long
width As Long
End Type

Hier ist es die Eigenschaft 'actThres'.

Neuronen kann man über die dll auswählen mittels der 'Select...' Funktionen, z.B.:
' Select all neurons in a hidden layer
Private Declare Function MB_SelectHiddenLayer Lib "MemBrainDll.dll" _
Alias "__MB_SelectHiddenLayer@8" (ByVal hidLayerIdx As Long, ByVal addToSelection As Long) As Long
Thomas Jetter

Harald
Posts: 11
Joined: Mon 11. Feb 2019, 11:06

Re: Gewichte speichern unter VB6

Post by Harald » Mon 18. Feb 2019, 20:47

Vielen Dank für die schnelle Hilfe.
Hat mir sehr weiter geholfen.

Jetzt hab ich aber noch eine Frage:

Unter VB6 lege ich ein Hidden-Neuron mit MB_AddHidden (ByVal posX As Long, ByVal posY As Long, ByVal name As String)
Das Hidden-Neuron ist dann ein Unresolved-Hidden Neuron.

Wie bekomme ich die Unresolved-Hidden-Neuronen in den Hidden-Layer?

Noch einmal vielen Dank für den schnellen Support.
Hätte ich nicht mit gerechnet.
Super Service!!!

Schöne Grüße aus der Provence(france)

Harald Berzins

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Gewichte speichern unter VB6

Post by TJetter » Mon 18. Feb 2019, 21:33

Harald wrote:
Mon 18. Feb 2019, 20:47
Unter VB6 lege ich ein Hidden-Neuron mit MB_AddHidden (ByVal posX As Long, ByVal posY As Long, ByVal name As String)
Das Hidden-Neuron ist dann ein Unresolved-Hidden Neuron.

Wie bekomme ich die Unresolved-Hidden-Neuronen in den Hidden-Layer?
Auch das geschieht ganz analog zu MemBrain in seiner graphischen Version:
Neuronen, deren Output nicht verlinkt ist, landen im 'Unresolved' Layer. MemBrain (bzw. die dll) sortiert sie automatisch in einen der Hidden Layer anhand der Netzarchitektur, in die sie eingebunden sind.
Dementsprechend:
1.) Extra-Selection zurücksetzen:
MB_ClearExtraSelection
2.) Alle Unresolved Neuronen selektieren, alles andere de-selektieren
' Select all unresolved neurons
MB_SelectAllUnresolved(0)
3.) Extra-Selection auf die gerade getroffene Auswahl anwenden:
MB_ExtraSelection
4.) Alle Output-Neuronen selektieren, alles andere de-selektieren:
MB_SelectAllOutputs(0)
5.) Extra-Selection verbinden auf Selection:
MB_ConnectFromExtra

--> Jetzt sind die ehemaligen Unresolved-Neuronen in den Context-Layer gewandert (da ihre Inputs noch nicht verbunden sind, ihre Outputs aber schon). Von dort kann man sie analog zu den obigen Schritten weiter verbinden, z.B. mit den Inputs. Dann wandern sie in den entsprechenden Hidden-Layer anhand der Netzanalyse.
Wenn die Inputs der Unresolved vorher schon verbunden waren, dann wandern sie direkt in den Hidden Layer, ohne Umweg über Context.
--> Am Besten mal in MemBrain nachvollziehen, unter Einblendung der 'Layer Info' <View><Show Layer Info>.

Anmerkung: Ab der kommenden MemBrain Version 10.xx.xx.xx wird sich das ändern: Neuronen, deren Inputs verbunden sind, deren Outputs aber nicht, werden nicht mehr dem Unresolved Layer zugeordnet, sondern dem entsprechend passenden Hidden Layer. Momentan (Stand 09.xx.xx.xx) ist es aber noch so wie beschrieben. Die Änderung wird notwendig, weil es dann Autoencoder-Training von Subnetzen in MemBrain geben wird.
Thomas Jetter

Harald
Posts: 11
Joined: Mon 11. Feb 2019, 11:06

Re: Gewichte speichern unter VB6

Post by Harald » Tue 19. Feb 2019, 11:39

Vielen Dank Herr Jetter, hat mir sehr geholfen.

Kann man nicht oft genug schreiben, Sie betreiben einen ausgezeichneten Support!!!

Liebe Grüße

Harald

Harald
Posts: 11
Joined: Mon 11. Feb 2019, 11:06

Re: Gewichte speichern unter VB6

Post by Harald » Tue 19. Feb 2019, 14:14

Hallo Herr Jetter,

ich muss noch mal nerven.

folgender Zustand:

3 Input, 3 Hidden, 3 Output angelegt mit
3 mal mit MB_AddInput PX, PY, Neuron_Name
3 mal mit MB_AddOutput PX, PY, Neuron_Name
3 mal mit MB_AddHidden PX, PY, Neuron_Name

Ergebiss:
Anz. Inputs=3
Anz. Outputs=3
Anz. Unresolved=3
Anz. Context=3
Anz. HiddenLayer=0
Anz. Hidden Neuronen=0

noch ist alles gut.

dann connect alle Unresolved zu allen Outputs mit:

MB_ClearSelection
MB_ClearExtraSelection

MB_SelectAllUnresolved 0
MB_ExtraSelection

MB_SelectAllOutputs 0
MB_ConnectFromExtra


Ergebniss:
Anz. Inputs=3
Anz. Outputs=3
Anz. Unresolved=0
Anz. Context=0
Anz. HiddenLayer=0
Anz. Hidden Neuronen=0

es gibt keine Unresolved, Conntext und Hidden Neuronen mehr.
dannach wollte ich folgendes durchführen,

MB_ClearSelection
MB_ClearExtraSelection

MB_SelectAllUnresolved 0
MB_ExtraSelection

MB_SelectAllInputs 0
MB_ConnectFromExtra

Wären Sie so freundlich mir noch einen Tipp zu geben.

Vielen Dank

Harald Berzins

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Gewichte speichern unter VB6

Post by TJetter » Tue 19. Feb 2019, 15:36

Würden Sie das Netz einmal abspeichern und in MemBrain versuchen zu öffnen?
Wie sieht es denn dann aus?
Thomas Jetter

Harald
Posts: 11
Joined: Mon 11. Feb 2019, 11:06

Re: Gewichte speichern unter VB6

Post by Harald » Tue 19. Feb 2019, 18:31

Bonjour Herr Jetter,
TestNetz.jpg
(116.67 KiB) Not downloaded yet
Alle Neuronen korrekt angelegt.

Der erste Verbindungsschritt ist auch korrekt.
Alle Verbindungen von Hidden-> Output vorhanden.

Danach waren die Hidden bzw. unresolved Neuronen verschwunden.
Somit konnte keine Verbindung von Input->Hidden bzw. unresolved- oder context-Neuronen hergestellt werden.

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Gewichte speichern unter VB6

Post by TJetter » Tue 19. Feb 2019, 19:34

Hallo,

hier ein Stück Testcode, den ich gerade erfolgreich getestet habe. Ist in C, nicht VBA, aber es ist trotzdem verständlich, denke ich.
Hier ist auch nach dem ersten Verbindungsschritt alles in Ordnung, ich habe unten als Kommentare die sich jeweils ergebenden Anzahlen für i, o, h, c, und hl hingeschrieben.
Den zweiten Verbindungsschritt müssen sie anders ausführen, siehe Code weiter unten.
--> Klappt es damit?
Die beiden sich ergebenden Netze hängen dem Post an.

Code: Select all

    _MB_AddInput(1000, 1000, "In 1");
    _MB_AddInput(1050, 1000, "In 2");
    _MB_AddInput(1100, 1000, "In 3");
    _MB_AddOutput(1000, 1400, "Out 1");
    _MB_AddOutput(1050, 1400, "Out 2");
    _MB_AddOutput(1100, 1400, "Out 3");
    _MB_AddHidden(1000, 1200, "Hid 1");
    _MB_AddHidden(1050, 1200, "Hid 2");
    _MB_AddHidden(1100, 1200, "Hid 3");

    _MB_ClearSelection();
    _MB_ClearExtraSelection();

    _MB_SelectAllUnresolved(FALSE);
    _MB_ExtraSelection();
    _MB_SelectAllOutputs(FALSE);
    _MB_ConnectFromExtra();

    int i = _MB_GetInputCount();        // 3
    int o = _MB_GetOutputCount();       // 3
    int h = _MB_GetHiddenCount(0);      // 0
    int c = _MB_GetContextCount();      // 3
    int hl = _MB_GetHiddenLayerCount(); // 0

    int ret = _MB_SaveNetAs("Test1.mbn");

    _MB_SelectAllContexts(FALSE);
    _MB_ExtraSelection();
    _MB_SelectAllInputs(FALSE);
    _MB_ConnectToExtra();

    i = _MB_GetInputCount();            // 3
    o = _MB_GetOutputCount();           // 3
    h = _MB_GetHiddenCount(0);          // 3
    c = _MB_GetContextCount();          // 0
    hl = _MB_GetHiddenLayerCount();     // 1

    ret = _MB_SaveNetAs("Test2.mbn");
Attachments
Test2.mbn
Nach zweitem Verbindungsschritt
(2.58 KiB) Downloaded 25 times
Test1.mbn
Nech erstem Verbindungsschritt
(1.95 KiB) Downloaded 26 times
Thomas Jetter

Post Reply