Einbinden von MemBrainDll in Unity 3d Script

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.
Amper
Posts: 9
Joined: Wed 7. Jun 2017, 09:06

Einbinden von MemBrainDll in Unity 3d Script

Post 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
Amper
Posts: 9
Joined: Wed 7. Jun 2017, 09:06

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
Last edited by Amper on Fri 9. Jun 2017, 08:56, edited 1 time in total.
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
Thomas Jetter
Amper
Posts: 9
Joined: Wed 7. Jun 2017, 09:06

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
Thomas Jetter
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
Thomas Jetter
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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]
Thomas Jetter
Amper
Posts: 9
Joined: Wed 7. Jun 2017, 09:06

Re: Einbinden von MemBrainDll in Unity 3d Script

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Einbinden von MemBrainDll in Unity 3d Script

Post by TJetter »

Die dll arbeitet mit 0-basierten Indizes. Wurde das beachtet? Rückgabewerte geprüft und behandelt?
Thomas Jetter
Amper
Posts: 9
Joined: Wed 7. Jun 2017, 09:06

Re: Einbinden von MemBrainDll in Unity 3d Script

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