Einbinden von MemBrainDll in Unity 3d Script
Einbinden von MemBrainDll in Unity 3d Script
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
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
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:
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
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());
}
}
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.
Re: Einbinden von MemBrainDll in Unity 3d Script
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
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
Re: Einbinden von MemBrainDll in Unity 3d Script
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
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
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.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
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
Re: Einbinden von MemBrainDll in Unity 3d Script
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.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
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
Re: Einbinden von MemBrainDll in Unity 3d Script
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.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
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
Re: Einbinden von MemBrainDll in Unity 3d Script
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
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
Die dll arbeitet mit 0-basierten Indizes. Wurde das beachtet? Rückgabewerte geprüft und behandelt?
Thomas Jetter
Re: Einbinden von MemBrainDll in Unity 3d Script
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?
Was soll Rückgabewert geprüft und behandelt heißen?