2016-11-01 13 views
0

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

enter image description here

Antwort

0

Dies bezieht sich nicht auf Mini-Charge SGD.

Es berechnet durchschnittliche Steigung über alle Zeitschritte. Nachdem der erste Zeitschritt avg_gradients den gerade berechneten Gradienten enthält, wird er nach dem zweiten Schritt elementweise gemittelt aus den zwei Gradienten aus den zwei Schritten, nach n Schritten wird er elementweise gemittelt aus allen n Gradienten, die bisher berechnet wurden. Diese mittleren Gradienten werden dann normalisiert (so dass ihre Norm Eins ist). Es ist schwer zu sagen, warum diese durchschnittlichen Gradienten ohne den Kontext, in dem sie präsentiert wurden, benötigt werden.

+0

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

+0

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

+0

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

Verwandte Themen