2016-11-01 9 views
5

Daniel ShiffmanのXORニューラルネットワークを迅速に実装しようとしていますが、私はすべての部品を持っていますが、トレーニングの結果は予想外です。XORニューラルネットワーク - 予期しない結果

私の一部は、一度に複数のことを学ぶことを実際の訓練システムと考えています。 https://www.dropbox.com/s/9rv8ku3d62h03ip/Neural.playground.zip?dl=0

ダニエルズコード:

Results Screenshot

私は何も悪いことを見つけることができる場合、誰に私の遊び場をリンクされているコード内のエラーのカップルがあります

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

+0

あなたはネットワークをいくつ作成していますか?あなたが少なくとも3つのノードを持っていると、1つの隠れたレイヤーを持つXORがはるかに良く動作することが分かりました。 – Simon

+0

4つのノードを持つ1つの隠れたレイヤーを持っています – Chris

+0

'Connection'を初期化するとき、' weight'プロパティに範囲'[0、1]'ですが、重みは[-1、1]の範囲でランダム化する必要があります。接続の初期化で 'self.weight = we'という行を' self.weight = 2 * we-1'に変更してみてください。 – dfri

答えて

1

。最初の(そして最も重要なのは)あなたのネットワークを作り出す方法の微妙なことです。

今あなたが

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() 
    } 

    ... 
} 

他の(マイナー)の事はある、私はそれが意図的であったかどうかはわかりませんが、結果は影響を受けていないようです。

Trained network

+1

ああ!私は "繰り返す"ことは知らなかった:同じ最初の議論を使用する: - /私の問題を明確にし解決するためにそんなにありがとう。私はstackoverflowが私にできるようにポイントを授与するでしょう。 – Chris