2016-11-01 11 views
5

मैं डैनियल शिफमैन के एक्सओआर न्यूरल नेटवर्क को तेजी से कार्यान्वित करने की कोशिश कर रहा हूं, मेरे पास सभी हिस्से हैं, लेकिन प्रशिक्षण के बाद, परिणाम अप्रत्याशित हैं।एक्सओआर न्यूरल नेटवर्क - अप्रत्याशित परिणाम

मेरे बारे में सोचता है कि यह एक ही समय में कई चीजों को सीखने की कोशिश कर रहा वास्तविक प्रशिक्षण प्रणाली है।

Results Screenshot

मैं मामले किसी में मेरे खेल का मैदान लिंक कर लिया है कुछ भी गलत पहचान सकते हैं: https://www.dropbox.com/s/9rv8ku3d62h03ip/Neural.playground.zip?dl=0

डेनियल कोड:

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

+0

आप कितने छिपे हुए परत नोड्स नेटवर्क बना रहे हैं? मैंने पाया है कि 1 छिपी परत के साथ एक्सओआर बहुत बेहतर काम करता है जब आपके पास कम से कम 3 नोड्स – Simon

+0

होते हैं, मेरे पास 1 छिपी हुई परत होती है, जिसमें 4 नोड्स – Chris

+0

'कनेक्शन' शुरू करते समय, आप 'वज़न' गुण को श्रेणी में यादृच्छिक मान देते हैं '[0, 1] ', लेकिन वजन' [-1, 1]' श्रेणी में यादृच्छिक होना चाहिए। 'कनेक्शन' के प्रारंभ में 'self.weight = 2 * we-1' में 'self.weight = we'' को बदलने का प्रयास करें। – dfri

उत्तर

1

अपने कोड में त्रुटियों की एक जोड़ी रहे हैं। पहला (और सबसे महत्वपूर्ण) आपके नेटवर्क बनाने के तरीके में एक सूक्ष्मता है। (इनपुट के लिए 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) की जगह के बजाय पूर्वाग्रह जोड़ रहे हैं, मैं पता नहीं है कि क्या उद्देश्य पर था लेकिन परिणाम अप्रभावित प्रतीत होता है।

Trained network

+1

आह! मुझे नहीं पता था कि "दोहराना:" वही पहला तर्क प्रयोग करता है: -/मेरी समस्या को स्पष्ट करने और हल करने के लिए बहुत बहुत धन्यवाद। स्टैक ओवरफ्लो मुझे देता है जब मैं अंक प्रदान करेंगे। – Chris

संबंधित मुद्दे