2017-11-21 3 views
0

Ich erstellte unterhalb neuronalen Netzwerk für die Wahrheitstabelle für die 3-Eingangslogik UND Tor, aber die erwartete Ausgabe für die [1,1,0] ist nicht korrekt. Ausgabe sollte sein 0. Aber es sagt als 0.9 voraus, das bedeutet ungefähr 1. So ist die Ausgabe nicht korrekt. Was ich also wissen muss, ist, wie man die Ausgangsvorhersage präziser macht. Bitte führe mich.Wie bekomme ich genaue Vorhersagen von einem neuronalen Netzwerk

import numpy as np 

class NeuralNetwork(): 
    def __init__(self): 

     self.X = np.array([[0, 0, 0], 
          [0, 0, 1], 
          [0, 1, 0], 
          [0, 1, 1], 
          [1, 0, 0], 
          [1, 0, 1], 
          [1, 1, 1]]) 

     self.y = np.array([[0], 
          [0], 
          [0], 
          [0], 
          [0], 
          [0], 
          [1]]) 

     np.random.seed(1) 

     # randomly initialize our weights with mean 0 
     self.syn0 = 2 * np.random.random((3, 4)) - 1 
     self.syn1 = 2 * np.random.random((4, 1)) - 1 

    def nonlin(self,x, deriv=False): 
     if (deriv == True): 
      return x * (1 - x) 

     return 1/(1 + np.exp(-x)) 

    def train(self,steps): 
     for j in xrange(steps): 

      # Feed forward through layers 0, 1, and 2 
      l0 = self.X 
      l1 = self.nonlin(np.dot(l0, self.syn0)) 
      l2 = self.nonlin(np.dot(l1, self.syn1)) 

      # how much did we miss the target value? 
      l2_error = self.y - l2 

      if (j % 10000) == 0: 
       print "Error:" + str(np.mean(np.abs(l2_error))) 

      # in what direction is the target value? 
      # were we really sure? if so, don't change too much. 
      l2_delta = l2_error * self.nonlin(l2, deriv=True) 

      # how much did each l1 value contribute to the l2 error (according to the weights)? 
      l1_error = l2_delta.dot(self.syn1.T) 

      # in what direction is the target l1? 
      # were we really sure? if so, don't change too much. 
      l1_delta = l1_error * self.nonlin(l1, deriv=True) 

      self.syn1 += l1.T.dot(l2_delta) 
      self.syn0 += l0.T.dot(l1_delta) 

     print("Output after training:") 
     print(l2) 

    def predict(self,newInput): 
     # Multiply the input with weights and find its sigmoid activation for all layers 
     layer0 = newInput 
     print("predict -> layer 0 : "+str(layer0)) 
     layer1 = self.nonlin(np.dot(layer0, self.syn0)) 
     print("predict -> layer 1 : "+str(layer1)) 
     layer2 = self.nonlin(np.dot(layer1, self.syn1)) 
     print("predicted output is : "+str(layer2)) 




if __name__ == '__main__': 
    ann=NeuralNetwork() 
    ann.train(100000) 
    ann.predict([1,1,0]) 

Ausgang:

Error:0.48402933124 
Error:0.00603525276229 
Error:0.00407346660344 
Error:0.00325224335386 
Error:0.00277628698655 
Error:0.00245737222701 
Error:0.00222508289674 
Error:0.00204641406194 
Error:0.00190360175536 
Error:0.00178613765229 
Output after training: 
[[ 1.36893057e-04] 
[ 5.80758383e-05] 
[ 1.19857670e-03] 
[ 1.85443483e-03] 
[ 2.13949603e-03] 
[ 2.19360982e-03] 
[ 9.95769492e-01]] 
predict -> layer 0 : [1, 1, 0] 
predict -> layer 1 : [ 0.00998162 0.91479567 0.00690524 0.05241988] 
predicted output is : [ 0.99515547] 
+0

Wird Ihre Eingabe richtig mit den Gewichten nach dem Training vorhergesagt? –

+0

@NanduKalidindi Das ist ein Punkt, den ich klären muss, denn nach meinem Verständnis werden Gewichte automatisch generiert, um die Ausgabe genauer zu erraten. Was du hier fragst, ist mir nicht klar. Bitte korrigieren Sie mich, falls ich falsch liege. –

+0

Ja, Sie trainieren mit den vorhandenen Eingaben, um Gewichtungen zu berechnen, die andere Werte als nur Ihre Eingaben vorhersagen können. Eine Möglichkeit, um zu überprüfen, ob Ihre Gewichte korrekt sind, besteht darin, dass Sie Ihre Methode 'ann.predict()' für alle '8' gegebenen Eingaben ausführen und die berechneten Werte mit den entsprechenden Ausgaben vergleichen. –

Antwort

0

Eigentlich tut es richtig Ausgabe erzeugen - das Modell ist nicht eindeutig. Ihre Eingabedaten passen A*B; der Wert der dritten Eingabe nie betrifft die angegebene Ausgabe, so hat Ihr Modell keine Möglichkeit zu wissen, dass es in Fall 110 wichtig sein soll. In Bezug auf die reine Informationstheorie, haben Sie nicht die Eingabe, um das Ergebnis zu erzwingen wollen.

0

Scheint wie dies für jeden Eingang geschieht, den Sie in dem AND-Gate vermissen. Zum Beispiel versuchen Sie, [0, 1, 1] Eingang mit [1, 1, 0] zu ersetzen und dann versuchen, [0, 1, 1] vorauszusagen es prognostiziert den endgültigen Wert in der Nähe von 1. Ich habe versucht, einschließlich biases und learning rate aber nichts scheint zu funktionieren.

Wie Prune erwähnt, könnte es sein, weil das BackPropagation Network nicht mit dem unvollständigen Modell arbeiten kann.

Um Ihr Netzwerk optimal zu trainieren und optimale Gewichte zu erhalten, stellen Sie alle möglichen Eingänge bereit, d. H. 8 Eingänge für das UND-Gatter. Dann können Sie immer die richtigen Vorhersagen erhalten, da Sie das Netzwerk bereits mit diesen Eingaben trainiert haben, was in diesem Fall mit Vorhersagen nicht sinnvoll ist. Vielleicht sind Vorhersagen auf einem kleinen Datensatz nicht so gut.

Das ist nur meine Vermutung, weil fast alle Netzwerke, die ich für Vorhersagen verwendete, früher größere Datensätze hatten.

Verwandte Themen