Page 1 of 2

Einbinden von MemBrainDll in Unity 3d Script

Posted: Wed 7. Jun 2017, 09:31
by Amper
Hallo Zusammen,

ich vermute zwar das ich mit meinem Problem hier im Forum an der falschen Stelle bin, ich versuche es dennoch.
Ich bin gerade dabeu die MemBraindll in Unity3d einzubinden um dort mein KI über Neuronalenetzte zu berechnen.
Die Scripte werden mit MonoDevelop (C#) geschrieben, mit dem Aufruf:
[DllImport("MemBrainDll64.dll")]
sollten eigentlich alle Funktionen der Dll nutzbar sein. Leider ist dem nicht so.

Ich gehe mal davon aus das sich hier niemand mit Unity3d auskennt und wenn doch könnte ich ein kurzes Beispiel haben wie ich auf eine DLL Funktion zugreifen kann.

Ansonsten würde mir sicher auch ein Beispiel helfen wie ich, Unity unabhängig in einem C# Programm auf die DLL zugreifen kann.

Vielen Dank schon mal für eure Hilfe

Grüße
Amper

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Wed 7. Jun 2017, 09:50
by Amper
Ok,

ich hab es rausgefunden die DLL´s müssen in einen Ordner Plugin im Assets Ordner.
Für die die es interessiert hier mein Test Script:

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class MemBrain : MonoBehaviour {
    
    [DllImport("MemBrainDll64")]  
    static extern int _MB_GetOutputWinnerNeuron();

    void Start () {
        Debug.Log (_MB_GetOutputWinnerNeuron());
    }
} 
Wichtig für Unity3d:
im Script MB_DLL müssen die Änderung .dll entfernt werden da Unity diese scheinbar selber noch einmal anhängt und MemBrainDLL.dll.dll dann nicht gefunden wird

Der Teil: static extern…
Muss für jede Funktion der DLL gemacht werden. Was mein Problem war, da ich das nicht wusste.

Ich werde jetzt die ein oder andere KI mit einem Neuronalen Netz ausstatten mal sehn wie gut das geht und wie erfolgreich es wird.

Bis dann
Amper

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Wed 7. Jun 2017, 17:08
by TJetter
Bin gespannt, was dabei heraus kommt, gerne hier berichten bzw. nach Untersützung fragen!

Im Download-Bereich der MemBrain Homepage gibt es übrigens einen C# Wrapper für die MemBrain DLL. Dieser bietet bereits ein objektorientiertes Interface zur DLL unter C#. Das könnte für die vorliegende Anwendung recht interessant sein, denke ich. Der Wrapper übernimmt nicht nur das eigentliche Ansprechen der DLL, sondern abstrahiert das index-basierte C-Interface der DLL weg, so dass man wirklich mit Netz- und Lesson-Objekten arbeiten kann.

Viele Grüße

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Fri 9. Jun 2017, 09:10
by Amper
Ich habe noch eine Frage zu den Netzen.

Wenn ich ein Spielfeld habe auf dem jedes Feld unterschiedliche Werte annehmen kann (z.B. 2, 4, 8, 16, 32 ... 4096.) ist es dann besser für jeden möglichen Wert eine Eingangsneurone zu nehmen oder kann ich die Werte direkt an das Netzt übergeben. Genau genommen ist bei jedem Wert ein anderes Verhalten notwendig, was denke ich, für einzelne Neuronen spricht.

Ach ja und ich habe festgestellt das die Güte der Trainingsdaten das Wichtigste ist und es scheinbar auch einen Unterschied macht in welche Reihenfolge die Daten eingespielt werden.
Kann es sein das ein Netzt ein anders Verhalten lernt wenn aufgezeichnete Spiel als Trainingsdaten in der Spiel Reihenfolge genommen werden oder die Daten in einer Zufälligen Reihenfolge genutzt werden?


Viele Grüße

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Fri 9. Jun 2017, 22:43
by TJetter
Amper wrote:(z.B. 2, 4, 8, 16, 32 ... 4096.) ist es dann besser für jeden möglichen Wert eine Eingangsneurone zu nehmen oder kann ich die Werte direkt an das Netzt übergeben
Wenn es diskrete Werte sind, denen keine größer/kleiner Bedeutung zu Grunde liegt, sondern eher eine Art Code oder Zustandsabbild, dann sind einzelne Neuronen meist die bessere Herangehensweise. Bei skalaren Werten, die eine physikalische Größe oder eine Bewertung darstellen besser ein Neuron nehmen.
Das heißt aber nicht, dass es ebenso viele EIngangsneuronen wie Werte sein müssen: Gut kann man z.B. auch binär codieren, also für jedes Bit ein Neuron.
Eine zeitabhängigkeit kann in den Mustern vorhanden sein, ja. Wenn es nicht das Ziel ist, diese Reihenfolge der Muster zu erlernen, dann trainiert man i.d.R. mit zufälliger Musterwahl. Im umgekehrten Fall trainiert man mit sortiertem Musterzugriff, dann aber mit einem zeitvarianten Netz, sonst macht das keinen Sinn.

Viele Grüße

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Fri 9. Jun 2017, 22:44
by TJetter
TJetter wrote:
Amper wrote:(z.B. 2, 4, 8, 16, 32 ... 4096.) ist es dann besser für jeden möglichen Wert eine Eingangsneurone zu nehmen oder kann ich die Werte direkt an das Netzt übergeben
Wenn es diskrete Werte sind, denen keine größer/kleiner Bedeutung zu Grunde liegt, sondern eher eine Art Code oder Zustandsabbild, dann sind einzelne Neuronen meist die bessere Herangehensweise. Bei skalaren Werten, die eine physikalische Größe oder eine Bewertung darstellen besser ein Neuron nehmen.
Das heißt aber nicht, dass es ebenso viele EIngangsneuronen wie Werte sein müssen: Gut kann man z.B. auch binär codieren, also für jedes Bit ein Neuron.
Eine Zeitabhängigkeit kann in den Mustern vorhanden sein, ja. Wenn es nicht das Ziel ist, eben diese Reihenfolge der Muster zu erlernen, dann trainiert man i.d.R. mit zufälliger Musterwahl. Im umgekehrten Fall trainiert man mit sortiertem Musterzugriff, dann aber mit einem zeitvarianten Netz, sonst macht das keinen Sinn.

Viele Grüße

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Fri 9. Jun 2017, 22:45
by TJetter
Amper wrote:(z.B. 2, 4, 8, 16, 32 ... 4096.) ist es dann besser für jeden möglichen Wert eine Eingangsneurone zu nehmen oder kann ich die Werte direkt an das Netzt übergeben
Wenn es diskrete Werte sind, denen keine größer/kleiner Bedeutung zu Grunde liegt, sondern eher eine Art Code oder Zustandsabbild, dann sind einzelne Neuronen meist die bessere Herangehensweise. Bei skalaren Werten, die eine physikalische Größe oder eine Bewertung darstellen besser ein Neuron nehmen.
Das heißt aber nicht, dass es ebenso viele EIngangsneuronen wie Werte sein müssen: Gut kann man z.B. auch binär codieren, also für jedes Bit ein Neuron.
Eine Zeitabhängigkeit kann in den Mustern vorhanden sein, ja. Wenn es nicht das Ziel ist, eben diese Reihenfolge der Muster zu erlernen, dann trainiert man i.d.R. mit zufälliger Musterwahl. Im umgekehrten Fall trainiert man mit sortiertem Musterzugriff, dann aber mit einem zeitvarianten Netz, sonst macht das keinen Sinn.

Viele Grüße[/quote]

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Thu 22. Jun 2017, 09:43
by Amper
Ich hab ein Problem beim Einbinden des Netz in mein Programm.

Ich hab einige hundert Trainingsdatensätze erzeugt und in MemBrain eingelesen um mein Netz zu trainieren. Geht auch alles wunderbar nach ca. 1800 durchläufen hab ich einen netzfehler von ca 0.1 was zum testen reichen. Wenn ich ein Test Daten anlege kommt auch ein akzeptables Ergebniss raus.

Wenn ich nun in meinem Programm das Netz lade (net.Load ("...))und ein Eingangsmuster anlege bekomme ich immer den geleichen Ausgangswert. Nach einigen Versuchen hab ich folgendes Getestet:

net.GetInputAct (1, out test1);
net.ApplyInputAct (1, test );
net.GetInputAct (1, out test2);

Angenommen test = 0.5 müsste doch test1 undefiniert oder = 0 sein und test2 = 0.5
bei mir sind beide Werte constant = 0;

Wenn ich GetInputActRange aufrufe bekomme ich immer -3,40282346638529E+38 und 3,4... zurück gemeldet.
Auch wenn ich diese Werte in Membrain für die Inputneurone änder.

Ich denke ich lade nur das Netz ohne die Gewichte der Verbindungen fals das überhaubt geht oder habe einen andern warscheinlich trivialen Fehler gemacht.

grüße
Amper

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Thu 22. Jun 2017, 10:56
by TJetter
Die dll arbeitet mit 0-basierten Indizes. Wurde das beachtet? Rückgabewerte geprüft und behandelt?

Re: Einbinden von MemBrainDll in Unity 3d Script

Posted: Thu 22. Jun 2017, 14:19
by Amper
Ja wurde, ich hab es für die Eingangsneuronen 0 bis 4 getestet es war immer das selbe Ergebniss.

Was soll Rückgabewert geprüft und behandelt heißen?