Ein Training kann relativ einfach gestaltet werden:
public class MachineLearningMain {
public static void main(String[] args) {
FeedForwardNetwork neuronalNetwork = new FeedForwardNetwork(
NetworkParameter.numberOfInputSignals,
NetworkParameter.numberOfNeuronsInHiddenLayer,
NetworkParameter.numberOfNeuronsInOutputLayer);
DisplayMachineLearning.showWeights(neuronalNetwork.getWeightsOfHiddenLayer(),
neuronalNetwork.getWeightsOfOutputLayer());
neuronalNetwork.testAllInputsAndShowResults();
neuronalNetwork.trainWithSupervisedLearning();
DisplayMachineLearning.showWeights(neuronalNetwork.getWeightsOfHiddenLayer(),
neuronalNetwork.getWeightsOfOutputLayer());
neuronalNetwork.testAllInputsAndShowResults();
}
}
Das Netzwerk wird erzeugt, die Anfangsgewichte und Anfangsresultate werden gezeigt. Danach wird das Supervised Learning durchgeführt (mit den entsprechenden Trainingsparametern). Am Ende wird gezeigt, wie sich die Gewichte verändert haben und ob sich die Ausgangsresultate verbessert haben.
Somit verbleibt nur noch eine Klasse (FeedForwardNetwork), die relativ groß, algorithmisch manchmal anspruchsvoll und leider nicht immer clean ist.
import java.util.ArrayList;
import java.util.Random;
public class FeedForwardNetwork {
private double[] inputLayer;
private ArrayList<Neuron> hiddenLayer;
private ArrayList<Neuron> outputLayer;
public FeedForwardNetwork(int numberOfNetworkInputSignals,
int numberOfNeuronsInHiddenLayer,
int numberOfNeuronsInOutputLayer) {
inputLayer = new double[numberOfNetworkInputSignals];
builtHiddenLayer(inputLayer.length, numberOfNeuronsInHiddenLayer);
builtOutputLayer(hiddenLayer.size(), numberOfNeuronsInOutputLayer);
ProcessMonitoring.lastOutputs = new double[numberOfNeuronsInOutputLayer];
ProcessMonitoring.lastOutputsFromHiddenLayer = new double[numberOfNeuronsInHiddenLayer];
if (TrainingParameter.weightsOfHiddenLayer != null)
setWeightsOfHiddenLayer(); // in the case of given weights (hidden layer)
if (TrainingParameter.weightsOfOutputLayer != null)
setWeightsOfOutputLayer(); // in the case of given weights (output layer)
}
// auf der nächsten Seite geht die Klasse FeedForwardNetwork weiter
Ein Objekt der Klasse FeedForwardNetwork besitzt 3 Attributswerte, nämlich den Input-Layer (als Feld von Double-Werten), den Hidden-Layer und den Output-Layer (jeweils als ArrayList von Neuronen).
Im Konstruktor werden in Abhängigkeit von den übergebenen Netzwerk-Parametern die 3 Schichten erzeugt. Danach werden für das Monitoring des Lernprozesses zwei Double-Felder erzeugt. Sollen bei speziellen Trainings-Settings die Anfangsgewichte von außen vorgegeben werden, werden sie entsprechend gesetzt.
- 41 -