2017-01-24 4 views
3

Ich bin neu in Neuronalen Netzwerken. Ich habe versucht, einfache 4-0-2 MLP zu schreiben und lernen Back-Propagation-Algorithmus in der Praxis. Aber meine Rückausbreitung divergiert immer und die Ausgabe ist immer [1,1]. Ich suchte nach der möglichen Ursache, aber weder die Lernrate auf eine relativ kleine Zahl (0,001) einzustellen, noch das Vorzeichen des Deltagewichts zu ändern, konnte das Problem lösen.Zurück Propagation Algorithmus funktioniert nicht richtig

-Code für Backpropagationalgorithmus:

def backward(self,trainingSamples): 
    for i in range(len(trainingSamples)): 
     curr_sample=trainingSamples[i] 
     self.input=curr_sample[0] 
     self.forward() 
     print("output is "+str(self.output)) 
     curr_des_out=curr_sample[1] 
     for i in range(len(self.outputs)): 
      error=curr_des_out[i]-self.outputs[i].output 
      der_act=self.outputs[i].activate(deriv=True) 
      local_gradient=der_act*error 
      for j in range(len(self.input)): 
       self.weights[j][i]-=self.learning_rate*local_gradient*self.input[j] 

und trainingSamples ist ein Tupel von Tupeln von Arrays: (([1,1,1,1],[1,0]), ([0,0,0,0],[0,1]),([1,0,0,0],[0,1]), ([1,0,1,0],[1,0]))

Hier ist der Vorwärts-Pass-Code:

def forward(self): 
    for i in range(len(self.outputs)): 
     for j in range(len(self.input)): 
      self.outputs[i].input+=self.input[j]*self.weights[j][i] 
     self.outputs[i].activate() 
     self.output[i]=self.outputs[i].output 
    return self.output 
+1

Können Sie zeigen, wie Sie die Ausgabe berechnen? Vielleicht stimmt auch etwas mit dem Forward nicht? (Ich will dich nicht beleidigen, aber je mehr wir ausschließen können, desto besser denke ich). –

+0

@david_l: vielleicht besser [bearbeiten] (http://stackoverflow.com/posts/41837181/edit) es in Ihrer Frage. –

+0

@ WillemVanOnsem, done –

Antwort

1

Althoug Ich kann die vollständige Implementierung Ihres Codes nicht sehen (Dinge wie .activate(), e Ich glaube, ich habe eine Idee, wie Sie sie umgesetzt haben. Wenn Sie sie richtig implementiert haben, sehe ich ein Problem mit Ihrem Code, das deutlich die Divergenz zeigt.

Das Problem - oder zumindest eines der Probleme - scheint, dass Sie den Eingang (Dendriten) Ihrer Neuronen nicht zurückgesetzt werden:

def forward(self): 
    for i in range(len(self.outputs)): 
     self.outputs[i].input = 0 
     for j in range(len(self.input)): 
      self.outputs[i].input+=self.input[j]*self.weights[j][i] 
     self.outputs[i].activate() 
     self.output[i]=self.outputs[i].output 
    return self.output

Da Sie den Eingang halten Inkrementieren, vermute ich, dass in der Tat Sie enden schließlich mit dem Ausgang [1,1], da die Sigmoid-Funktion auf 1 geht, wenn der Eingang in die Unendlichkeit geht.

+0

Ich verwende Sigmoid als Aktivierungsfunktion. –

+0

@david_I: Ja, aber ich nehme an, dass der Sigmoid die Eingabe der Sitzung nicht löscht? –

+0

Danke für Hilfe! Es funktioniert jetzt! –

Verwandte Themen