Код дает мне VectorSizeMismatchException с использованием Neuroph - PullRequest
0 голосов
/ 05 июня 2019

Я знаю, как кодировать, используя Java, но я новичок в Neuroph. Я получил VectorSizeMismatchException с этими кодами.

Main: https://pastebin.com/dntWRMZN

public static void main(String[] args) {
    AiManager.trainNeuralNetwork(AiManager.initilizeNetwork());
}

Менеджер: https://pastebin.com/csWsiVvt

import org.neuroph.core.Layer;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.Neuron;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.nnet.Perceptron;
import org.neuroph.util.ConnectionFactory;
import org.neuroph.util.NeuralNetworkType;

public class AiManager {

  public static NeuralNetwork<?> initilizeNetwork() {
    Layer inputLayer = new Layer();
    inputLayer.addNeuron(new Neuron());
    inputLayer.addNeuron(new Neuron());

    Layer hiddenLayerOne = new Layer();
    hiddenLayerOne.addNeuron(new Neuron());
    hiddenLayerOne.addNeuron(new Neuron());
    hiddenLayerOne.addNeuron(new Neuron());
    hiddenLayerOne.addNeuron(new Neuron());

    Layer hiddenLayerTwo = new Layer();
    hiddenLayerTwo.addNeuron(new Neuron());
    hiddenLayerTwo.addNeuron(new Neuron());
    hiddenLayerTwo.addNeuron(new Neuron());
    hiddenLayerTwo.addNeuron(new Neuron());

    Layer outputLayer = new Layer();
    outputLayer.addNeuron(new Neuron());

    NeuralNetwork<?> ann = new Perceptron(2, 1);

    ann.setInputNeurons(inputLayer.getNeurons());
    ann.setOutputNeurons(outputLayer.getNeurons());

    ann.addLayer(0, inputLayer);
    ann.addLayer(1, hiddenLayerOne);

    ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));

    ann.addLayer(2, hiddenLayerTwo);

    ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2));

    ann.addLayer(3, outputLayer);

    ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3));

    ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(ann.getLayersCount()-1), false);

    ann.setNetworkType(NeuralNetworkType.MULTI_LAYER_PERCEPTRON);

    ann.setInputNeurons(inputLayer.getNeurons());
    ann.setOutputNeurons(outputLayer.getNeurons());

    return ann;
  }

  public static NeuralNetwork<?> trainNeuralNetwork(NeuralNetwork<?> ann) {
    int inputSize = 2;
    int outputSize = 1;
    DataSet ds = new DataSet(inputSize, outputSize);

    DataSetRow rOne = new DataSetRow(new double[] { 0, 1 }, new double[] { 1 });

    ds.addRow(rOne);

    DataSetRow rTwo = new DataSetRow(new double[] { 1, 1 }, new double[] { 0 });

    ds.addRow(rTwo);

    DataSetRow rThree = new DataSetRow(new double[] { 0, 0 }, new double[] { 0 });

    ds.addRow(rThree);

    DataSetRow rFour = new DataSetRow(new double[] { 1, 0 }, new double[] { 1 });

    ds.addRow(rFour);

    ann.learn(ds);

    return ann;
  }
}

1 Ответ

0 голосов
/ 05 июня 2019

Эта ошибка связана с тем, как кодируется API Neuroph, поскольку вы можете дважды добавить выражения ann.setInputNeurons(inputLayer.getNeurons()); и ann.setOutputNeurons(outputLayer.getNeurons());, но если вы напечатаете выражение ann.getInputNeurons().size() до и после вызова этих выражений, вы будет видеть, что каждый раз, когда вы «устанавливаете» входные нейроны, вы добавляете новых нейронов.

См. Источник класса NeuralNetwork:

/**
 * Sets input neurons
 *
 * @param inputNeurons array of input neurons
 */
public void setInputNeurons(List<Neuron> inputNeurons) {
    for (Neuron neuron : inputNeurons) {
        this.inputNeurons.add(neuron);
    }
}

Теоретически удаление этих 4 строк должно устранить ошибку.

...