2013-08-01 11 views
5

मैं एक ही उत्पादन इकाई (बाइनरी वर्गीकरण) के साथ MLP का एक सरल कार्यान्वयन लिख रहा हूँ। मुझे शिक्षण उद्देश्यों के लिए इसकी आवश्यकता है, इसलिए मैं मौजूदा कार्यान्वयन का उपयोग नहीं कर सकता :(बहुपरत perceptron कार्यान्वयन: वजन जाना पागल

मैं एक काम करने वाले डमी मॉडल बनाने और प्रशिक्षण समारोह लागू करने में कामयाब रहा, लेकिन एमएलपी अभिसरण नहीं करता है। वास्तव में, आउटपुट इकाई के लिए ढाल उच्च रहता है अवधियों से अधिक है, इसलिए इसके वजन अनंत दृष्टिकोण

मेरे कार्यान्वयन:।

import numpy as np 
from sklearn.metrics import confusion_matrix 
from sklearn.metrics import classification_report 

X = np.loadtxt('synthetic.txt') 
t = X[:, 2].astype(np.int) 
X = X[:, 0:2] 

# Sigmoid activation function for output unit 
def logistic(x): 
    return 1/(1 + np.exp(-x)) 

# derivative of the tanh activation function for hidden units 
def tanh_deriv(x): 
    return 1 - np.tanh(x)*np.tanh(x) 

input_num = 2   # number of units in the input layer 
hidden_num = 2   # number of units in the hidden layer 

# initialize weights with random values: 
weights_hidden = np.array((2 * np.random.random((input_num + 1, hidden_num + 1)) - 1) * 0.25) 
weights_out = np.array((2 * np.random.random( hidden_num + 1) - 1) * 0.25) 


def predict(x): 
    global input_num 
    global hidden_num 
    global weights_hidden 
    global weights_out 

    x = np.append(x.astype(float), 1.0)  # input to the hidden layer: features + bias term 
    a = x.dot(weights_hidden)   # activations of the hidden layer 
    z = np.tanh(a)       # output of the hidden layer 
    q = logistic(z.dot(weights_out))  # input to the output (decision) layer 
    if q >= 0.5: 
     return 1 
    return 0 



def train(X, t, learning_rate=0.2, epochs=50): 
    global input_num 
    global hidden_num 
    global weights_hidden 
    global weights_out 

    weights_hidden = np.array((2 * np.random.random((input_num + 1, hidden_num + 1)) - 1) * 0.25) 
    weights_out = np.array((2 * np.random.random( hidden_num + 1) - 1) * 0.25) 

    for epoch in range(epochs): 
     gradient_out = 0.0      # gradients for output and hidden layers 
     gradient_hidden = [] 

     for i in range(X.shape[0]):    
     # forward propagation 
      x = np.array(X[i])      
      x = np.append(x.astype(float), 1.0) # input to the hidden layer: features + bias term 
      a = x.dot(weights_hidden)   # activations of the hidden layer 
      z = np.tanh(a)      # output of the hidden layer 
      q = z.dot(weights_out)    # activations to the output (decision) layer 
      y = logistic(q)      # output of the decision layer 

     # backpropagation 
      delta_hidden_s = []     # delta and gradient for a single training sample (hidden layer) 
      gradient_hidden_s = [] 

      delta_out_s = t[i] - y    # delta and gradient for a single training sample (output layer) 
      gradient_out_s = delta_out_s * z 

      for j in range(hidden_num + 1):     
       delta_hidden_s.append(tanh_deriv(a[j]) * (weights_out[j] * delta_out_s)) 
       gradient_hidden_s.append(delta_hidden_s[j] * x) 

      gradient_out = gradient_out + gradient_out_s    # accumulate gradients over training set 
      gradient_hidden = gradient_hidden + gradient_hidden_s 

    print "\n#", epoch, "Gradient out: ",gradient_out, 
     print "\n  Weights out: ", weights_out 

     # Now updating weights 
     weights_out = weights_out - learning_rate * gradient_out 

     for j in range(hidden_num + 1): 
      weights_hidden.T[j] = weights_hidden.T[j] - learning_rate * gradient_hidden[j] 



train(X, t, 0.2, 50) 

और युग खत्म हो गया ढाल और उत्पादन इकाई के लिए वजन के विकास:

0 Gradient out: [ 11.07640724 -7.20309009 0.24776626] 
    Weights out: [-0.15397237 0.22232593 0.03162811] 

    1 Gradient out: [ 23.68791197 -19.6688382 -1.75324703] 
    Weights out: [-2.36925382 1.66294395 -0.01792515] 

    2 Gradient out: [ 79.08612305 -65.76066015 -7.70115262] 
    Weights out: [-7.10683621 5.59671159 0.33272426] 

    3 Gradient out: [ 99.59798656 -93.90973727 -21.45674943] 
    Weights out: [-22.92406082 18.74884362 1.87295478] 

...

49 Gradient out: [ 107.89975864 -105.8654327 -104.69591522] 
    Weights out: [-1003.67912726 976.87213404 922.38862049] 

मैं अलग डेटासेट, छिपा इकाइयों के विभिन्न संख्या की कोशिश की। मैं घटाव के बजाय इसके साथ वजन को अद्यतन करने की कोशिश की ... कुछ भी नहीं है में मदद करता है ...

किसी मुझे बता सकते हैं कि क्या गलत हो सकता है? अग्रिम

+0

हाय, आप, 'synthetic.txt' देते हैं मैं इसे डिबग और उम्मीद है कि आवश्यक सुधार स्पॉट जाएगा कृपया कर सकते हैं, मैं पहले से ही पूर्वाग्रह अवधि कि उत्पादन परत को जाता है, साथ ही साथ जोड़ने की जरूरत जैसे कुछ याद आ रही भागों पाया पूर्वाग्रह को अद्यतन करने की व्यवस्था को बदलना जो अन्य वजन को अद्यतन करने से काफी अलग है। धन्यवाद – Curious

+3

हाय, वास्तव में मैं इस मुद्दे को पहले से ही समाधान कर लिया है। आप सही हैं, मैंने छुपा परत में पूर्वाग्रह को याद किया। साथ ही, मैंने स्क्वायर त्रुटि फ़ंक्शन के योग के लिए बैकप्रोपैगेशन को फिर से लिखा है। आपकी रुचि के लिए धन्यवाद। –

उत्तर

2

धन्यवाद मैं नहीं मानता कि आप द्विआधारी वर्गीकरण के लिए चौराहों त्रुटि फ़ंक्शन का योग का उपयोग करना चाहिए। इसके बजाय आप पार एन्ट्रापी त्रुटि समारोह है, जो मूल रूप से एक संभावना समारोह है का उपयोग करना चाहिए। इस तरह त्रुटि आपकी भविष्यवाणी सही उत्तर से अधिक महंगी हो जाएगी। कृपया के बारे में "पैटर्न मान्यता और मशीन लर्निंग" में "नेटवर्क प्रशिक्षण" पीपी। 235 क्रिस्टोफर बिशप द्वारा अनुभाग पढ़ें, यह है आप कैसे एक FFNN पर निगरानी सीखने करने के बारे में एक उचित सिंहावलोकन दे देंगे।

पूर्वाग्रह इकाइयों अत्यंत महत्वपूर्ण हैं, इस प्रकार वे हस्तांतरण funct के लिए यह संभव बनाते हैं। एक्स-वक्र के साथ स्थानांतरित करने के लिए। वजन हस्तांतरण समारोह की खड़ीता बदल जाएगा। वक्र। पूर्वाग्रहों और वजन के बीच इस अंतर को ध्यान दें, के रूप में यह कारण है कि वे दोनों एक FFNN में उपस्थित रहने की जरूरत पर एक अच्छी समझ दे देंगे।

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