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.
'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. –
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. –
@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. –