Neuronales Netz

Bitte aktiviere JavaScript!
Hey,

ich schreibe ein kleines Netz und benutze dafür die Bibliothek Neuroph. Inputdaten sind dabie Dinge wie:

Spielerposition, Gegnerposition, Geschwindigkeit, Größe, aber auch die letzte Eingabe des Spielers...

die Ausgabe soll dann eine "Kraft" mit x,y sein, die dann den Spieler bewegt.
Ich nehme die Inputdaten wie folgt auf:

1. Mensch drückt <r>
2. Aufnahme beginnt und nimmt nun in jedem Spieldurchlauf (Durchlauf der Gameloop) alle Daten auf (speichert sie)
3. Nach ca 1 minute hat man dann ca. 5000 Trainingsdaten (vllt overfittet das Netzwerk?)
Sollte ich dafür die Liste mal etwas mischen, schließlich lernt es immer 20-30 ähnliche Beispiele

Leider konvergiert das folgende Netz nicht. Vorschläge:?


Java:
package suchtytv.complexservice.game.maths.artificialneuralnetwork.multilayerperceptron;

import java.util.ArrayList;
import java.util.Arrays;
import org.neuroph.core.Layer;
import org.neuroph.core.Neuron;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.learning.error.MeanSquaredError;

import org.neuroph.core.transfer.Sigmoid;
import org.neuroph.core.transfer.TransferFunction;
import org.neuroph.nnet.MultiLayerPerceptron;
import org.neuroph.nnet.learning.BackPropagation;

import suchtytv.complexservice.game.maths.VectorND;

public class GamePlayingNetwork  {
    MultiLayerPerceptron nn;
    public GamePlayingNetwork(int inputNodes, int outPutNodes) {
 

        nn = new MultiLayerPerceptron(inputNodes,50,50,outPutNodes); //create NN  with 48 inputNodes and 2 outputNodes
        for(Layer l : nn.getLayers()) {
            for(Neuron n : l.getNeurons()) {
                n.setTransferFunction(new TransferFunction() { //recalibrate Sigmoid for better use !!! Library never asked about derivative: f' =  2*simoid' !!!
            
                    @Override
                    public double getOutput(double totalInput) {
                        // TODO Auto-generated method stub
                        return 2/(1+Math.exp(-totalInput))-1; //sigmoid between -1 and 1
                    }
            });
                System.out.println(n.getInputConnections().size());
            }
        }
        BackPropagation bp = new BackPropagation();
        bp.setLearningRate(0.5); //In any case points will beconverging to a to big local minima (if they are converging)
        bp.setErrorFunction(new MeanSquaredError()); //should I use a linearity?
        bp.setMaxIterations(100);
        nn.setLearningRule(bp);

    }
 
    public void train(ArrayList<VectorND> samples) { //Train the network
        System.out.println("Training with "+ samples.size() + " sample(s)... this could take a while ");

        DataSet set = new DataSet(47, 2);
        for(VectorND nd : samples) {
        double[] all = nd.getArray();
        double[] input  = Arrays.copyOfRange(all, 0, 47);
        double[] output  = Arrays.copyOfRange(all, 47, 49); //VectorND is just a multidimensional Vector including the data
        set.addRow(input, output);
 
 
        }
        //set.shuffle() does not help either
        nn.learn(set);
//        nn.getLearningRule().setLearningRate(nn.getLearningRule().getLearningRate() - 0.5*nn.getLearningRule().getLearningRate());
        System.out.println("Training Done");
    }

    public MultiLayerPerceptron getNeuralNetwork() {
        return nn;
 
    }

    public void setInput() {
 
 
    }

    public void setInput(double[] array) {
        nn.setInput(array);
 
    }

    public VectorND getOutput() {
        // TODO Auto-generated method stub
        double[] b = nn.getOutput();
        VectorND nd = new VectorND();
        nd.add(b);
        return nd;
    }
 
 

}
 
Zuletzt bearbeitet:
Ok ich habe ein paar Fragen....
Was sind die Inputdaten?
Was sind Beispielinputdaten?
Was ist das Ziel?
Hast du mal per Hand versucht, die Lernrate herunterzuschrauben und / oder die Iterationen zu erhöhen?
Die Mittlere quadratische Abweichung (new MeanSquaredError()) ist schon ok....

Dann noch etwas das ist eigentlich überwachtes Lernen das heißt wenn nicht müsstest du eigentlich die Backpropagation weg lassen. Wie hier zu sehen ist.

Also aus der Hüfte: bp.setLearningRate(0.1); oder bp.setLearningRate(0.01); und bp.setMaxIterations(15000); und der rest SOLLTE vielleicht funktionieren.
 
Hey, meine Inputs (Beispielinputs sind die Trainingsdaten) sind wie folgt strukturiert:

Java:
        //Aufzeichnen des Spiels, wenn gewollt.
        if(Simulation.recordGame) {
            VectorND nd = new VectorND();
            //Adding PlayerPositions
            nd.addElement(player.getPosition().getX()); //add properties of the player
            nd.addElement(player.getPosition().getY());
            nd.addElement(player.getSpeed().getX());//
            nd.addElement(player.getSpeed().getY());//
            nd.addElement(lastforce.getX()); //add the last force which was applied before
            nd.addElement(lastforce.getY());
            //Adding Position of GameObjects (Maximum) and radius
            for(GameObject o : gameList) {
                if(o instanceof Bird) {
                    Bird b = (Bird)o;
                    nd.addElement(b.getPosition().getX()); //add properties of the birds
                    nd.addElement(b.getPosition().getY()); //
                    nd.addElement(b.getRadius());
                    nd.addElement(b.getSpeed().getX());
                    nd.addElement(b.getSpeed().getY());

                }
            }
            //Adding MousePosition
            nd.addElement(1); //add bias if necessary ?!?!
            force.div(2*forcemultiplier); //Turning force to actual force //just translate values for ANN
            nd.addElement(force.getX());   // add the force the ANN shall apply
            nd.addElement(force.getY()); //
            movieMaker.addData(nd);
        }
        lastforce = force.clone();
eine Version des Spiels versuche ich anzuhängen (selbst programmierter Quatsch :))
Ist aber nicht alles kommentiert ;( Du solltest aber selbst kompilieren können

EDIT: Die Datei ist zu groß damit ich sie kompilieren kann

Spielanleitung:

Du bewegst die Kugel mit der Maus.
Du kannst mir <r> eine Trainingaufnahme starten.
Du kannst nachdem du eine Traini ngsaufnahme gestartet hast mit <t> das Netz trainieren
Du kannst mit <p> den Roboter spielen lassen, sobald du das Netz trainiert hatest
Öffne das Spiel mit der Konsole um zusätzliche Infos zu erhalten
Du kannst das Spiel mit Mausklick restarten
 

Anhänge

Zuletzt bearbeitet:
JA - das ist einfach ein Survivalgame, überlebe solange wie möglich. Die Anfangsbedingungen sind zufällig. Einzelspiel.

Ich brauchte nur ein einfaches Spiel um das zumachen was ich jetzt mache und da ich momentan eine BeLL schreibe kann ich da nichts zu sehr viel "nicht mathematik" implementieren

Kompiliert habe ich ja - aber wenn du kompilierst ist die Datei nicht zu groß ... srry...
Ich hab deine Tipps eingebaut - haben nicht geklappt ;(

Trotzdem erst mal danke für die Mühe :)
 
Also:

Mit 0.01 und 15000 hatte ich es bereits probiert und das Training endet nach 3s ohne Erfolg.
Mit 0.1 rechnet er und rechnet und rechnet und rechnet und rechnet und rechnet nur um dann genau das selbe zumachen wie das 0.01 ... Nichts sinnvolles (einfach in eine richtung wegfliegen)

EDIT: Bei dem Netzwerk (49,50,2) rechnet er nochmal viel länger (noch nicht fertig) als bei dem Netzwerk (49,20,20,2)

Danke für deine Antwort :)

Gruß Niclas
 
Zuletzt bearbeitet:
Auskennen ist da "leicht" übertrieben... und es ist auch ein paar Jährchen her, dass ich mich damit beschäftigt habe. Das Bias-Neuron ist einfach ein zusätzliches Neuron je Layer mit dem konstanten Wert 1. Den genauen Sinn müsste ich jetzt erst nachsehen, sofern ich mich entsinne, hatte das irgendeinen mathematischen Hintergrund. Ich habe mir nur gemerkt, dass man die Daten normalisieren und Bias-Neuronen verwenden soll :)

EDIT: hier wird es z. B. beschrieben: https://stackoverflow.com/questions/2480650/role-of-bias-in-neural-networks
 
Zuletzt bearbeitet:
Ja, im Link zu Stackoverflow (s. oben) ist das ganze noch im Zusammenhang mit der Aktivierungsfunktion dargestellt und ein paar schöne Beispiele sind auch dabei :)
 
Wieso kommt da als nächster Videovorschlag "Bares für Rares" bei Youtube? :rolleyes:
Also nochmal kurz zusammenfassen (ich lerne auch besser mit temporell-volativen Skizzen), ein Bias-Neutron ist ein Neutron mit zusätzlichem 1-Eingang.
Zusammen mit der Aktivierungsfunktion, den Funktionssummen und den Lernregel(n) gibt es dann das komplette Neutron.
Und wie sich das auf ein MLP NN auswirkt, weiß keiner....
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben