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:?
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: