wake-up-neo.com

java einfaches neuronales Netzwerk-Setup

Ich habe mich entschlossen, mit ein paar einfachen Konzepten zu arbeiten, die neuronale Netzwerke in Java beinhalten, und durch die Anpassung von etwas nutzlosem Code, den ich in einem Forum gefunden habe, konnte ich ein sehr einfaches Modell für die XOR - Simulation eines typischen Anfängers erstellen :


public class MainApp {
    public static void main (String [] args) {
        Neuron xor = new Neuron(0.5f);
        Neuron left = new Neuron(1.5f);
        Neuron right = new Neuron(0.5f);
        left.setWeight(-1.0f);
        right.setWeight(1.0f);
        xor.connect(left, right);

        for (String val : args) {
            Neuron op = new Neuron(0.0f);
            op.setWeight(Boolean.parseBoolean(val));
            left.connect(op);
            right.connect(op);
        }

        xor.fire();

        System.out.println("Result: " + xor.isFired());

    }
}

public class Neuron {
    private ArrayList inputs;
    private float weight;
    private float threshhold;
    private boolean fired;

    public Neuron (float t) {
        threshhold = t;
        fired = false;
        inputs = new ArrayList();
    }

    public void connect (Neuron ... ns) {
        for (Neuron n : ns) inputs.add(n);
    }

    public void setWeight (float newWeight) {
        weight = newWeight;
    }

    public void setWeight (boolean newWeight) {
        weight = newWeight ? 1.0f : 0.0f;
    }

    public float getWeight () {
        return weight;
    }

    public float fire () {
        if (inputs.size() > 0) {
            float totalWeight = 0.0f;
            for (Neuron n : inputs) {
                n.fire();
                totalWeight += (n.isFired()) ? n.getWeight() : 0.0f;
            }
            fired = totalWeight > threshhold;
            return totalWeight;
        }
        else if (weight != 0.0f) {
            fired = weight > threshhold;
            return weight;
        }
        else {
            return 0.0f;
        }
    }

    public boolean isFired () {
        return fired;
    }
}

In meiner Hauptklasse habe ich die einfache Simulation zur Modellierung von Jeff Heatons Diagramm erstellt: XOR diagram

Ich wollte jedoch sicherstellen, dass meine Implementierung für die Neuron-Klasse korrekt ist. Ich habe bereits alle möglichen Eingaben getestet ([true true], [true false], [false true], [false false]) und sie haben alle bestanden meine manuelle Bestätigung Da dieses Programm die Eingaben als Argumente akzeptiert, scheint es außerdem die manuelle Überprüfung für Eingaben wie [true false false], [true true false] usw. zu übergeben.

Aber wäre diese Implementierung konzeptionell korrekt? Oder wie kann ich das verbessern, bevor ich mich weiter mit diesem Thema beschäftige?

Vielen Dank!

22
jerluc

Es sieht nach einem guten Ausgangspunkt aus. Ich habe einige Vorschläge:

  1. Aus Skalierbarkeit sollte fire () neu strukturiert werden, damit ein Neuron, das bereits mit dem aktuellen Eingabesatz ausgelöst wurde, nicht jedes Mal neu berechnet werden muss. Dies wäre der Fall, wenn Sie eine andere ausgeblendete Schicht oder mehr als einen Ausgabeknoten hätten.

  2. Erwägen Sie, Ihren Schwellenwert in eine eigene Methode aufzuteilen. Dann können Sie Neuron subclassieren und verschiedene Arten von Aktivierungsfunktionen verwenden (bipolares Sigmoid, RBF, linear usw.).

  3. Um komplexere Funktionen zu erlernen, fügen Sie jedem Neuron einen Bias-Eingang hinzu. Es ist im Grunde wie eine andere Eingabe mit eigenem Gewichtswert, aber die Eingabe ist immer auf 1 (oder -1) festgelegt.

  4. Vergessen Sie nicht, Trainingsmethoden zuzulassen. Backpropagation benötigt etwas wie die Umkehrung von Feuer (), um eine Zielausgabe zu erhalten und die Gewichtsänderungen durch jede Schicht zu rippen.

9
darkcanuck

Aufgrund der (begrenzten) Arbeit, die ich mit neuronalen Netzen gemacht habe, sieht diese Implementierung und das Modell für mich korrekt aus - die Ausgabe ist das, was ich erwarten würde, und die Quelle sieht solide aus.

0
Michael Berry