Python tensorflow中的小批量梯度下降实现
在阅读tensorflow实现的深度学习模型时,我试图理解培训过程中包含的以下代码段Python tensorflow中的小批量梯度下降实现,python,tensorflow,deep-learning,gradient-descent,Python,Tensorflow,Deep Learning,Gradient Descent,在阅读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)):
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_梯度
将包含刚刚计算的梯度,在第二步之后,它将是两个步骤中两个梯度的元素平均值,n
步骤之后,它将是迄今为止计算的所有n
梯度的元素平均值。然后对这些平均梯度进行归一化(使其范数为1)。很难说为什么需要这些平均梯度,而不考虑它们出现的背景。这与小批量SGD无关
它计算所有时间步长上的平均梯度。在第一个时间步之后,
avg_梯度
将包含刚刚计算的梯度,在第二步之后,它将是两个步骤中两个梯度的元素平均值,n
步骤之后,它将是迄今为止计算的所有n
梯度的元素平均值。然后对这些平均梯度进行归一化(使其范数为1)。很难说,如果没有介绍这些平均梯度的背景,为什么需要这些平均梯度。嗨,伊萨梅尔,谢谢你的回答。我在原始帖子中包含了整个培训迭代部分。另一件让我困惑的事情是关于平均梯度,它最初被定义为零。然后在avg_梯度[i]=(avg_梯度[i]*(1.0-(1.0/(步骤+1)))+(梯度[i]/(步骤+1)),因为avg_梯度[i]=0,看起来左侧的第一项正好等于0。avg_梯度[i]=梯度[i]/(步骤+1),对吗?我只是不知道这个梯度运算的目的是什么。是的,它正处于第一步,此时step+1
=1,所以avg_梯度[I]=grandients[I]
。在每一个连续的步骤中,avg_梯度为None的条件不成立,因此它不再为零。我明白了,谢谢。但是,如果不是批处理SGD,那么这个实现的底层算法(或逻辑)是什么呢。我刚刚更新了原始帖子。实际的小批量SGD发生在batch\u x,batch\u y=data\u provider(self.batch\u size)
(这会给你一个小批量数据)和sess.run((self.optimizer
(这将执行实际的SGD,或者更可能是它的某些高级版本,如Adam或RMSProp,具体取决于优化器是什么)。现在还不清楚他们为什么需要这些平均梯度,他们没有在任何地方使用它们。谢谢你的回复。我在原始帖子中包括了整个训练迭代部分。另一件让我困惑的事情是关于平均梯度,它最初定义为零。然后在平均梯度中[I]=(平均梯度[I]*(1.0-(1.0/(步骤+1))+(梯度[i]/(步骤+1)),因为avg_梯度[i]=0,看起来左侧的第一项正好等于0。avg_梯度[i]=梯度[i]/(步骤+1),是吗?我只是不知道这个梯度运算的目的是什么。是的,它在第一步是正确的,此时step+1
=1,所以avg_梯度[I]=grandients[I]
。在每一个连续步骤中,条件平均梯度为“无”
不起作用,因此不再为零。我明白了,谢谢。但基本算法(或逻辑)是什么对于这个实现,如果不是批处理SGD。我只是更新了原始帖子。实际的小批量SGD发生在batch\u x,batch\u y=data\u provider(self.batch\u size)
(这会给你一个小批量的数据)和sess.run((self.optimizer
(这将执行实际的SGD,或者更可能是它的某些高级版本,如Adam或RMSProp,具体取决于优化器是什么)。目前还不清楚他们为什么需要这些平均梯度,他们在任何地方都不使用它们