Wenn ich eine Tensorflow-Implementierung für ein Deep Learning-Modell lese, versuche ich das folgende Codesegment zu verstehen, das im Trainingsprozess enthalten ist.Mini-Batch-Gradient anständige Implementierung in Tensorflow
self.net.gradients_node = tf.gradients(loss, self.variables)
for epoch in range(epochs):
total_loss = 0
for step in range((epoch*training_iters), ((epoch+1)*training_iters)):
batch_x, batch_y = data_provider(self.batch_size)
# Run optimization op (backprop)
_, loss, lr, gradients = sess.run((self.optimizer, self.net.cost, self.learning_rate_node, self.net.gradients_node),
feed_dict={self.net.x: batch_x,
self.net.y: util.crop_to_shape(batch_y, pred_shape),
self.net.keep_prob: dropout})
if avg_gradients is None:
avg_gradients = [np.zeros_like(gradient) for gradient in gradients]
for i in range(len(gradients)):
avg_gradients[i] = (avg_gradients[i] * (1.0 - (1.0/(step+1)))) + (gradients[i]/(step+1))
norm_gradients = [np.linalg.norm(gradient) for gradient in avg_gradients]
self.norm_gradients_node.assign(norm_gradients).eval()
total_loss += loss
Ich denke, es zu Mini-Batch-Gradientenverfahren verwendet ist, aber ich kann nicht verstehen, wie es funktioniert, oder ich habe einige Schwierigkeiten gezeigt, den Algorithmus zu verbinden, wie folge
Hallo lshamael, danke für die Antwort. Ich füge den gesamten Trainingsiterationsteil in den ursprünglichen Beitrag ein. Die andere Sache, die mich verwirrt, ist über avg_gradients, die ursprünglich als Null definiert wurde. Dann in avg_gradients [i] = (avg_gradienten [i] * (1.0 - (1.0/(Schritt + 1)))) + (Gradienten [i]/(Schritt + 1)), da avg_gradients [i] = 0, sieht wie der erste Term auf der linken Seite gerade gleich 0. und avg_gradients [i] = Gradienten [i]/(Schritt + 1), ist das richtig? Ich kann einfach nicht herausfinden, was diese Gradientenoperation erreichen soll. – user288609
Ja, es ist richtig ** auf dem ersten Schritt **, zu dieser Zeit "Schritt + 1" = 1, und so 'avg_gradients [i] = Großeltern [i]'. Bei jedem folgenden Schritt ist die Bedingung 'avg_gradients None' nicht gültig und daher ist sie nicht mehr Null. – Ishamael
Ich sehe, danke. Aber was ist der zugrundeliegende Algorithmus (oder Logik) für diese Implementierung, wenn es nicht Batch-SGD ist. Ich habe gerade den ursprünglichen Post aktualisiert. – user288609