。最初の(そして最も重要なのは)あなたのネットワークを作り出す方法の微妙なことです。
今あなたが
inputs = [Neuron](repeating: Neuron(), count:2+1)
hidden = [Neuron](repeating: Neuron(), count:4+1)
を使用している。しかし、これは同じNeuron
ですべての入力を作成しても同じNeuron
を持つすべてのhidden
、これだけ4 Neuron
sがあります。2入力のために(規則的に2回繰り返され、バイアスニューロンが繰り返されます。
あなたは、単にforループを使って、それを解決することができます:あなたはNeuron
の出力は、あなたがそれ(bias = from.output*c.weight
)を置き換えるのではなく、バイアスを追加している計算するとき
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()
}
...
}
他の(マイナー)の事はある、私はそれが意図的であったかどうかはわかりませんが、結果は影響を受けていないようです。
あなたはネットワークをいくつ作成していますか?あなたが少なくとも3つのノードを持っていると、1つの隠れたレイヤーを持つXORがはるかに良く動作することが分かりました。 – Simon
4つのノードを持つ1つの隠れたレイヤーを持っています – Chris
'Connection'を初期化するとき、' weight'プロパティに範囲'[0、1]'ですが、重みは[-1、1]の範囲でランダム化する必要があります。接続の初期化で 'self.weight = we'という行を' self.weight = 2 * we-1'に変更してみてください。 – dfri