Auch die Implementierung des Forward-Pass ist selbsterklärend und clean:
public void calculateOutput(double[] input) {
setInputLayer(input);
calculateOutputFromHiddenLayer(input);
calculateOutputFromOutputLayer();
}
private void setInputLayer (double[] inputLayer) {
this.inputLayer = inputLayer;
}
private void calculateOutputFromHiddenLayer(double[] inputOfInputLayer) {
for (int i = 0; i < hiddenLayer.size(); i++)
ProcessMonitoring.lastOutputsFromHiddenLayer[i] = hiddenLayer.get(i).getOutput(
inputOfInputLayer, TrainingParameter.activationFunction);
}
private void calculateOutputFromOutputLayer() {
for (int i = 0; i < outputLayer.size(); i++)
ProcessMonitoring.lastOutputs[i] = outputLayer.get(i).getOutput(
ProcessMonitoring.lastOutputsFromHiddenLayer, TrainingParameter.activationFunction);
}
// nach dem nächsten Satz geht die Klasse FeedForwardNetwork weiter
Das reine Training ist algorithmisch auch sehr verständlich:
public void trainWithSupervisedLearning() {
for (int epoche = 1; epoche <= TrainingParameter.numberOfEpochs; epoche++) {
int sample = new Random().nextInt(TrainingParameter.inputs.length);
calculateOutput(TrainingParameter.inputs[sample]);
makeBackPropagationForOutputLayer(TrainingParameter.targets[sample]);
makeBackPropagationForHiddenLayer(TrainingParameter.inputs[sample],
TrainingParameter.targets[sample]);
}
}
// auf der nächsten Seite geht die Klasse FeedForwardNetwork weiter
- 43 -