Künstliche Intelligenz mit Java
Maschinelles Lernen mit Neuronalen Netzwerken

Wie werden aber die beiden Neuronen-Schichten genau erzeugt? Ganz einfach:

  private void builtHiddenLayer(int numberOfLayerInputSignals, 
                                int numberOfNeuronsInHiddenLayer) {
    hiddenLayer = new ArrayList<Neuron>();
    double bias = 2 * new Random().nextDouble() - 1;
    for (int i = 0; i < numberOfNeuronsInHiddenLayer; i++)
      hiddenLayer.add(new Neuron(numberOfLayerInputSignals, outputLayer, bias));
  }

  private void builtOutputLayer(int numberOfLayerInputSignals, 
                                int numberOfNeuronsInOutputLayer) {
    outputLayer = new ArrayList<Neuron>();
    double bias = 2 * new Random().nextDouble() - 1;
    for (int i = 0; i < numberOfNeuronsInOutputLayer; i++)
      outputLayer.add(new Neuron(numberOfLayerInputSignals, null, bias));
  }

Die zufälligen Gewichte der einzelnen Neuronen liegen zwischen -1 und +1.

Jetzt werden für die Gewichte des Hidden-Layers und des Output-Layers Verwaltungsmethoden (setter/getter) zur Verfügung gestellt:

  public void setWeightsOfHiddenLayer() {
    for (int i = 0; i < hiddenLayer.size(); i++)
      for (int j = 0; j < inputLayer.length + 1; j++)            // + 1 (bias)
        hiddenLayer.get(i).setWeights(j, TrainingParameter.weightsOfHiddenLayer[i][j]);
  }

  public double[][] getWeightsOfHiddenLayer() {
    double[][] weightsOfHiddenLayer =
      new double[hiddenLayer.size()][hiddenLayer.size() + 1];    // + 1 (bias)
    for (int i = 0; i < hiddenLayer.size(); i++)
      for (int j = 0; j < inputLayer.length + 1; j++)            // + 1 (bias)
        weightsOfHiddenLayer[i][j] = hiddenLayer.get(i).getWeights()[j];
    return weightsOfHiddenLayer;
  }

  public void setWeightsOfOutputLayer() {
    for (int i = 0; i < outputLayer.size(); i++)
      for (int j = 0; j < hiddenLayer.size() + 1; j++)           // + 1 (bias)
        outputLayer.get(i).setWeights(j, TrainingParameter.weightsOfOutputLayer[i][j]);
  }

  public double[][] getWeightsOfOutputLayer() {
    double[][] weightsOfOutputLayer =
      new double[outputLayer.size()][hiddenLayer.size() + 1];    // + 1 (bias)
    for (int i = 0; i < outputLayer.size(); i++)
      for (int j = 0; j < hiddenLayer.size() + 1; j++)           // + 1 (bias)
        weightsOfOutputLayer[i][j] = outputLayer.get(i).getWeights()[j];
    return weightsOfOutputLayer;
  }

  // auf der nächsten Seite geht die Klasse FeedForwardNetwork weiter 


Die 4 Methoden sind selbsterklärend.


- 42 -