2016-11-01 2 views
5

Я стараюсь внедрить Neor Network XOR от Даниила Шиффмана в быстрые, у меня есть все части, но после обучения результаты неожиданны.XOR Neural Network - неожиданные результаты

Часть меня думает, что это настоящая система обучения, пытающаяся сразу изучить несколько вещей.

Results Screenshot

Я связан моя игровая площадка в случае, если кто может обнаружить ничего плохого: https://www.dropbox.com/s/9rv8ku3d62h03ip/Neural.playground.zip?dl=0

Daniels код:

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

+0

Сколько узлов скрытых слоев вы создаете сеть с? Я обнаружил, что XOR с 1 скрытым слоем работает намного лучше, если у вас есть как минимум 3 узла – Simon

+0

У меня есть 1 скрытый слой с 4 узлами – Chris

+0

При инициализации 'Connection' вы присваиваете свойству' weight' случайное значение в диапазоне '[0, 1]', но веса должны быть рандомизированы в диапазоне '[-1, 1]'. Попробуйте изменить строку 'self.weight = we' в инициализации' Connection' на 'self.weight = 2 * we-1'. – dfri

ответ

1

Есть несколько ошибок в коде. Первый (и самый важный) - это тонкость в том, как вы создаете свои сети.

Прямо сейчас вы используете

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

Но это создает все входы с одинаковым Neuron, а также все hidden с тем же Neuron, так что есть только 4 Neuron s: 2 для ввода (регулярное повторение 2 раза и нейронный синдром) и 2 для скрытых (регулярное повторение 4 раза и 1 для смещения).

Вы можете решить, просто используя для цикла:

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

    ... 
} 

Другой (второстепенный) Дело в том, при расчете на выходе из Neuron вы добавляете смещение вместо того, чтобы заменить его (bias = from.output*c.weight), я не знаю, было ли это специально, но результат, похоже, не затронут.

Trained network

+1

ах! Я понятия не имел, что «повторяю:» использует тот же самый первый аргумент: -/Большое вам спасибо за разъяснение и решение моей проблемы. Я буду награждать точки, когда stackoverflow позволяет мне. – Chris