Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tensorflow中的小批量梯度下降实现_Python_Tensorflow_Deep Learning_Gradient Descent - Fatal编程技术网

Python 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)):

在阅读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_梯度
将包含刚刚计算的梯度,在第二步之后,它将是两个步骤中两个梯度的元素平均值,
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,具体取决于
优化器是什么)。目前还不清楚他们为什么需要这些平均梯度,他们在任何地方都不使用它们