Как заставить объект обновлять свое значение на основе изменения значений других объектов в Java? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь сделать базовое c моделирование нейронной сети. Он состоит из нейронов и нейронных соединений. В приведенном ниже коде значение нейрона2 должно изменяться всякий раз, когда обновляется значение нейрона1:

public class Main {

    public static void main(String[] args) {
        Neuron neuron1 = new Neuron();
        Neuron neuron2 = new Neuron();

        NeuronConnection neuronConnection = new NeuronConnection(neuron1, neuron2);

        neuron1.addInput(20);
        System.out.println(neuron2.getOutput());
    }
}

На данный момент я получаю только «0», что является значением по умолчанию.

Вот код для объектов Neuron и NeuronConncetion:

public class Neuron {
    private double output;
    private List<Double> inputArray;

    public Neuron() {
        output = 0;
        inputArray = new LinkedList<>();
    }

    public Neuron (double input) {
        inputArray = new LinkedList<>();
        inputArray.add(input);
        output += input;
    }

    public void addInput(double input) {
        inputArray.add(input);
        output += input;
    }

    public void addMultipleInputs(List<Double> inputs) {
        inputArray.addAll(inputs);
        for (double input: inputs) {
            output += input;
        }
    }

    public double getOutput() {
        return output;
    }
}
public class NeuronConnection {
    private double weight;
    private Neuron inNeuron;
    private Neuron outNeuron;
    private double outValue;

    public NeuronConnection(Neuron inNeuron, Neuron outNeuron) {
        this.inNeuron = inNeuron;
        this.outNeuron = outNeuron;
        weight = Math.random();
        outValue = inNeuron.getOutput()*weight;
        outNeuron.addInput(outValue);
    }

    public double getOutValue() {
        return outValue;
    }
}

Вопрос: : Как мне заставить нейрон2 изменять свое значение всякий раз, когда я изменяю вход нейрона1?

1 Ответ

0 голосов
/ 03 августа 2020

Я предлагаю вам простое решение. Вам просто нужно сохранить ссылку на NeuronConnection в Neuron классе и добавить метод setConnection () и вызвать NeuronConnection's update() method (который мы добавим позже в NeuronConnection) из addInput() или addMultipleInputs() метода Neuron class. Новый дизайн класса Neuron:

public class Neuron {
    private NeuronConnection conn;
    private double output;
    private List<Double> inputArray;

    public Neuron() {
        output = 0;
        inputArray = new LinkedList<>();
    }

    public Neuron (double input) {
        inputArray = new LinkedList<>();
        inputArray.add(input);
        output += input;
    }

    public void addInput(double input) {
        inputArray.add(input);
        output += input;
        conn.update();
    }

    public void addMultipleInputs(List<Double> inputs) {
        inputArray.addAll(inputs);
        for (double input: inputs) {
            output += input;
        }
        conn.update();
    }

    public double getOutput() {
        return output;
    }

    // i've added this method
    public void setConnection(NeuronConnection conn) {
        this.conn = conn;
    }
}

Теперь измените дизайн вашего класса NeuronConnection:

public class NeuronConnection {
    private double weight;
    private Neuron inNeuron;
    private Neuron outNeuron;
    private double outValue;

    public NeuronConnection(Neuron inNeuron, Neuron outNeuron) {
        this.inNeuron = inNeuron;
        this.outNeuron = outNeuron;

        // now, setConnection
        this.inNeuron.setConnection(this);
        this.outNeuron.setConnection(this);

        weight = Math.random();
        outValue = inNeuron.getOutput()*weight;
        outNeuron.addInput(outValue);
    }

    public double getOutValue() {
        return outValue;
    }

    // i've added this
    public void update() {
      // this calculation is little flawed
      // you've to edit/fix this as you think it will be
      // perfect for your neural network
      outValue = inNeuron.getOutput() * weight;
      outNeuron.addInput(outValue);
    }
}

Теперь, класс Main, изменений нет ...

public class Main {

    public static void main(String[] args) {
        Neuron neuron1 = new Neuron();
        Neuron neuron2 = new Neuron();

        NeuronConnection neuronConnection = new NeuronConnection(neuron1, neuron2);

        neuron1.addInput(20);
        System.out.println(neuron2.getOutput());
    }
}

Я не тестировал код, но он должен помочь вам на правильном пути ...

Дайте мне знать, если у вас возникнут вопросы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...