张量流中的小批量梯度下降实现
mini-batch gradient descent implementation in tensorflow
在阅读深度学习模型的 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
我认为它与小批量梯度下降有关,但我不明白它是如何工作的,或者我很难将它与如下所示的算法联系起来
这与小批量 SGD 无关。
它计算所有时间步长的平均梯度。在第一个时间步后 avg_gradients
将包含刚刚计算的梯度,在第二步之后它将是两个步骤的两个梯度的元素平均值,在 n
步骤之后它将是所有元素的平均值到目前为止计算的 n
梯度。然后将这些平均梯度归一化(以便它们的范数为一)。很难说为什么需要这些平均梯度而不考虑它们出现的上下文。
在阅读深度学习模型的 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
我认为它与小批量梯度下降有关,但我不明白它是如何工作的,或者我很难将它与如下所示的算法联系起来
这与小批量 SGD 无关。
它计算所有时间步长的平均梯度。在第一个时间步后 avg_gradients
将包含刚刚计算的梯度,在第二步之后它将是两个步骤的两个梯度的元素平均值,在 n
步骤之后它将是所有元素的平均值到目前为止计算的 n
梯度。然后将这些平均梯度归一化(以便它们的范数为一)。很难说为什么需要这些平均梯度而不考虑它们出现的上下文。