Есть несколько ошибок в коде. Первый (и самый важный) - это тонкость в том, как вы создаете свои сети.
Прямо сейчас вы используете
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
), я не знаю, было ли это специально, но результат, похоже, не затронут.
Сколько узлов скрытых слоев вы создаете сеть с? Я обнаружил, что XOR с 1 скрытым слоем работает намного лучше, если у вас есть как минимум 3 узла – Simon
У меня есть 1 скрытый слой с 4 узлами – Chris
При инициализации 'Connection' вы присваиваете свойству' weight' случайное значение в диапазоне '[0, 1]', но веса должны быть рандомизированы в диапазоне '[-1, 1]'. Попробуйте изменить строку 'self.weight = we' в инициализации' Connection' на 'self.weight = 2 * we-1'. – dfri