अपने कोड में त्रुटियों की एक जोड़ी रहे हैं। पहला (और सबसे महत्वपूर्ण) आपके नेटवर्क बनाने के तरीके में एक सूक्ष्मता है। (इनपुट के लिए 2:
अभी आप
inputs = [Neuron](repeating: Neuron(), count:2+1)
hidden = [Neuron](repeating: Neuron(), count:4+1)
उपयोग कर रहे हैं लेकिन यह एक ही Neuron
है और यह भी एक ही Neuron
के साथ सभी hidden
के साथ सभी निवेशों की सृष्टि करती है, इसलिए केवल 4 Neuron
रों देखते हैं
नियमित रूप से 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
) की जगह के बजाय पूर्वाग्रह जोड़ रहे हैं, मैं पता नहीं है कि क्या उद्देश्य पर था लेकिन परिणाम अप्रभावित प्रतीत होता है।
आप कितने छिपे हुए परत नोड्स नेटवर्क बना रहे हैं? मैंने पाया है कि 1 छिपी परत के साथ एक्सओआर बहुत बेहतर काम करता है जब आपके पास कम से कम 3 नोड्स – Simon
होते हैं, मेरे पास 1 छिपी हुई परत होती है, जिसमें 4 नोड्स – Chris
'कनेक्शन' शुरू करते समय, आप 'वज़न' गुण को श्रेणी में यादृच्छिक मान देते हैं '[0, 1] ', लेकिन वजन' [-1, 1]' श्रेणी में यादृच्छिक होना चाहिए। 'कनेक्शन' के प्रारंभ में 'self.weight = 2 * we-1' में 'self.weight = we'' को बदलने का प्रयास करें। – dfri