2016-11-01 3 views
5

Ich versuche, Daniel Shiffmans XOR Neural Network in Swift zu implementieren, ich habe alle Teile, aber nach dem Training sind die Ergebnisse unerwartet.XOR Neuronales Netzwerk - unerwartete Ergebnisse

Ein Teil von mir denkt, es ist das eigentliche Trainingssystem, das versucht, mehrere Dinge gleichzeitig zu lernen.

Results Screenshot

ich mein Spielplatz falls jemand verbunden haben, können etwas falsch erkennen: https://www.dropbox.com/s/9rv8ku3d62h03ip/Neural.playground.zip?dl=0

Daniels Code:

https://github.com/shiffman/The-Nature-of-Code-Examples/blob/master/chp10_nn/xor/code/src/Network.java

+0

Wie viele versteckte Layer-Knoten erstellen Sie das Netzwerk mit? Ich habe festgestellt, dass XOR mit 1 versteckter Ebene viel besser funktioniert, wenn Sie mindestens 3 Knoten haben – Simon

+0

Ich habe 1 versteckte Ebene mit 4 Knoten – Chris

+0

Bei der Initialisierung von 'Connection' geben Sie der' weight' Eigenschaft einen zufälligen Wert im Bereich '[0, 1]', aber die Gewichte sollten im Bereich '[-1, 1]' randomisiert sein. Versuchen Sie die Zeile 'self.weight = we 'in der Initialisierung von' Connection' in 'self.weight = 2 * we-1' zu ändern. – dfri

Antwort

1

Es gibt ein paar Fehler im Code. Die erste (und wichtigste) ist eine subtile Art und Weise, wie Sie Ihre Netzwerke erstellen.

Gerade jetzt Sie verwenden

inputs = [Neuron](repeating: Neuron(), count:2+1) 
hidden = [Neuron](repeating: Neuron(), count:4+1) 

Aber das schafft alle Eingänge mit der gleichen Neuron und auch alle hidden mit derselben Neuron, so gibt es nur 4 Neuron s: 2 für die Eingabe (die regulär 2 mal wiederholt und ein Bias-Neuron) und 2 für versteckt (das regelmäßige 4 mal wiederholt und 1 für Bias).

Sie können es lösen, indem einfach eine for-Schleife:

public class Network 
{ 
    var inputs:[Neuron] = [] 
    var hidden:[Neuron] = [] 
    var output:Neuron! 

    public init() 
    { 
     for _ in 1...2 { 
      inputs.append(Neuron()) 
     } 

     for _ in 1...4 { 
      hidden.append(Neuron()) 
     } 

     //print("inputs length: \(inputs.count)") 

     inputs.append(Neuron(bias: true)) 
     hidden.append(Neuron(bias: true)) 

     output = Neuron() 

     setupInputHidden() 
     setupHiddenOutput() 
    } 

    ... 
} 

Die andere (kleinere) Sache ist, wenn Sie die Ausgabe eines Neuron berechnen Sie zum Bias Zugabe anstatt sie zu ersetzen (bias = from.output*c.weight), ich Ich weiß nicht, ob das absichtlich war, aber das Ergebnis scheint nicht betroffen zu sein.

Trained network

+1

ah! Ich hatte keine Ahnung, dass "Wiederholen:" das gleiche erste Argument verwendet: - Vielen Dank für die Klärung und Lösung meines Problems. Ich werde die Punkte vergeben, wenn stackoverflow mich lässt. – Chris