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.
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
Ich habe 1 versteckte Ebene mit 4 Knoten – Chris
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