2017-11-27 1 views
0

Ich bin entlang Mnielsen Online book folgen. Ich versuche, Momentum Gewicht Update wie definiert here zu seinem Code here zu implementieren. Die allgemeine Idee ist, dass für die Momentgewichtsaktualisierung der Gewichtsvektor mit negativem Gradienten nicht direkt geändert wird. Sie haben einen Parameter velocity, den Sie zunächst auf Null setzen und dann den Hyperparameter mu auf 0.9 setzen.Implementierung Momentum Gewicht Update für neuronales Netzwerk

# Momentum update 
v = mu * v - learning_rate * dx # integrate velocity 
x += v # integrate position 

So habe ich Gewicht w und im Gewicht als nebla_w im folgenden Code-Schnipsel ändern:

def update_mini_batch(self, mini_batch, eta): 
     """Update the network's weights and biases by applying 
     gradient descent using backpropagation to a single mini batch. 
     The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta`` 
     is the learning rate.""" 
     nabla_b = [np.zeros(b.shape) for b in self.biases] 
     nabla_w = [np.zeros(w.shape) for w in self.weights] 
     for x, y in mini_batch: 
      delta_nabla_b, delta_nabla_w = self.backprop(x, y) 
      nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] 
      nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] 
     self.weights = [w-(eta/len(mini_batch))*nw 
         for w, nw in zip(self.weights, nabla_w)] 
     self.biases = [b-(eta/len(mini_batch))*nb 
         for b, nb in zip(self.biases, nabla_b)] 

so in den letzten beiden Zeilen aktualisieren Sie self.weight als

self.weights = [w-(eta/len(mini_batch))*nw 
       for w, nw in zip(self.weights, nabla_w)] 

für Schwung Gewichtsaktualisierung Ich mache folgendes:

self.momentum_v = [ (momentum_mu * self.momentum_v) - ((float(eta)/float(len(mini_batch)))* nw) 
        for nw in nebla_w ] 
self.weights = [ w + v 
       for w, v in zip (self.weights, self.momentum_v)] 

Allerdings erhalte ich folgende Fehlermeldung:

TypeError: can't multiply sequence by non-int of type 'float' 

für momentum_v Update. Mein eta Hyperparameter ist bereits float, obwohl ich es wieder mit Float-Funktion eingewickelt habe. Ich wickelte auch len(mini_batch) durch Schwimmer. Ich habe auch versucht, nw.astype(float) zu tun, aber ich werde immer noch den Fehler bekommen. Ich bin mir nicht sicher warum. nabla_w ist ein numpy Array von Schwimmern.

+0

'TypeError: kann die Sequenz nicht durch Nicht-Int des Typs 'float' multiplizieren nicht passieren, wenn sie beide numpy Arrays sind. Etwas ist eine Liste oder ein Tupel oder eine andere Sequenz und * nicht * ein numpliges Array. Drucken Sie 'type (variable)' 'für jede zu multiplizierende Variable, und Sie werden sehen, dass etwas kein numpiges Array ist. Du hast deine Definitionen von 'momentum_mu' und' momentum_v' nicht gezeigt, vielleicht sind sie die Täter? Für z.B. Siehe meine Antwort von früher heute [hier] (https://stackoverflow.com/questions/47520890/error-cant-multiply-sequence-by-non-int-of-type-float/47521032#47521032) vom selben Fehler Botschaft. –

+0

Auch der Fehler sagt Ihnen nicht, dass Sie * ein * Float verwenden sollten, es sagt Ihnen, dass Sie einen 'float' verwenden, wo Sie * nicht * können, also eine Menge Dinge als' float' zu werfen ist nicht werde helfen, das Problem zu lösen. Irgendwo multiplizierst du ein Tupel oder eine Liste mit einem Float. –

+0

@AlexanderReynolds Ich sehe es jetzt! Ich initialisierte momentum_v falsch, das war kein numpliges Array !.Ich danke dir sehr. Sie können im Antwortbereich schreiben und dann kann ich Ihre Antwort akzeptieren. –

Antwort

0

Wie in den Kommentaren besprochen, ist hier nichts ein numpiges Array. Der Fehler, der oben gegebenen

TypeError: can't multiply sequence by non-int of type 'float' 

ist ein Fehler durch Python für die Sequenztypen (list, Tupels, etc) ausgegeben. Die Fehlermeldung bedeutet, dass eine Sequenz nicht mit einem Nicht-Int multipliziert werden kann. Sie können durch einen int multipliziert werden, was jedoch die Werte nicht ändern --- sie wiederholt nur die Reihenfolge, dh

>>> [1, 0] * 3 
[1, 0, 1, 0, 1, 0] 

Und natürlich in diesem Rahmen durch einen Schwimmer Multiplikation macht keinen Sinn :

>>> [1, 0] * 3.14 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't multiply sequence by non-int of type 'float' 

Sie sehen die gleiche Fehlermeldung, die Sie hier haben. Eine der Variablen, die Sie multiplizieren, ist in der Tat kein numpliges Array und ist einer der generischen Sequenztypen. Ein einfacher Cast von np.array() um die problematische Variable würde es beheben, oder natürlich können Sie einfach die Definition in ein Array ändern.

Verwandte Themen