Der Algorithmus der vorherigen Seite wird jetzt für das Neuronale Netzwerk vollständig implementiert:
private void makeBackPropagationForOutputLayer(double[] targets) {
System.out.println("\nbackpropagation output layer");
double[] possibleBiasValuesForOutputlayer = new double[targets.length];
for (int i = 0; i < ProcessMonitoring.lastOutputs.length; i++) {
double lastOutputI = ProcessMonitoring.lastOutputs[i];
System.out.println("\noutput: " + lastOutputI + " target: " + targets[i] + "\n");
int numberOfWeightsInclBias = outputLayer.get(i).getWeights().length;
for (int j = 0; j < numberOfWeightsInclBias; j++) {
double singleWeightError = (targets[i] - lastOutputI) * (lastOutputI) *
(1 - lastOutputI);
double deltaW = singleWeightError * TrainingParameter.learningRate;
deltaW *= (isNotABiasWeight(j, numberOfWeightsInclBias)) ?
ProcessMonitoring.lastOutputsFromHiddenLayer[j] : 1;
double newWeight = outputLayer.get(i).getWeights(j) + deltaW;
if (isNotABiasWeight(j, numberOfWeightsInclBias)) {
outputLayer.get(i).setWeights(j, newWeight);
System.out.println("new weight: " + newWeight);
}
else {
System.out.println("bias calculation " + (i + 1) + ": " + newWeight);
possibleBiasValuesForOutputlayer[i] = newWeight;
}
}
}
if (TrainingParameter.isBiasBackPropagationDesired)
setBias(possibleBiasValuesForOutputlayer, outputLayer);
}
// die Klasse FeedForwardNetwork geht gleich weiter
Zwei Methoden wurden ausgelagert. Die erste Methode gibt an, ob ein Gewicht ein „normales Gewicht“ oder ein Bias-Gewicht ist:
private boolean isNotABiasWeight(int j, int numberOfWeightsInclBias) {
return j < numberOfWeightsInclBias - 1;
}
// die Klasse FeedForwardNetwork geht gleich weiter
// die Klasse FeedForwardNetwork geht auf der nächsten Seite weiter
- 46 -