Tensorflow:opt.compute_gradients()返回的值与opt.apply_gradients()的权重差不同

Tensorflow:opt.compute_gradients()返回的值与opt.apply_gradients()的权重差不同,tensorflow,Tensorflow,问题:在TensorFlow网络中,以最有效的方式获取权重增量的最有效方式是什么 背景:我已将操作员连接到以下位置(多亏了这一点): self.cost=`网络的其余部分` self.rmsprop=tf.train.RMSPropOptimizer(lr,rms\u衰减,0.0,rms\u eps) self.comp_grads=self.rmsprop.compute_梯度(self.cost) self.grad_占位符=[(tf.placeholder(“float”,shape=gr

问题:在TensorFlow网络中,以最有效的方式获取权重增量的最有效方式是什么

背景:我已将操作员连接到以下位置(多亏了这一点):

self.cost=`网络的其余部分` self.rmsprop=tf.train.RMSPropOptimizer(lr,rms\u衰减,0.0,rms\u eps) self.comp_grads=self.rmsprop.compute_梯度(self.cost) self.grad_占位符=[(tf.placeholder(“float”,shape=grad[1]。get_shape(),name=“grad_占位符”),grad[1])表示self.comp_grads中的grad] self.apply_grads=self.rmsprop.apply_渐变(self.grad_占位符) 现在,为了输入信息,我运行以下命令:

feed_dict = `training variables` grad_vals = self.sess.run([grad[0] for grad in self.comp_grads], feed_dict=feed_dict) feed_dict2 = `feed_dict plus gradient values added to self.grad_placeholder` self.sess.run(self.apply_grads, feed_dict=feed_dict2) feed_dict=`训练变量` grad\u vals=self.sess.run([grad[0]表示self.comp\u grads中的grad],feed\u dict=feed\u dict) feed_dict2=`feed_dict加上添加到self.grad_占位符的渐变值` self.sess.run(self.apply\u grads,feed\u dict=feed\u dict2)
run(self.apply_grads)
命令将更新网络权重,但当我计算开始和结束权重的差异时(
run(self.w1)
),这些数字与存储在
grad\u vals[0]
中的数字不同。我想这是因为RMSPropOptimizer对原始渐变做的更多,但我不确定是什么,或者在哪里找到它的作用

那么回到问题上来:我如何以最有效的方式获得我体重的增量?我是否被困在多次运行self.w1.eval(sess)以获取权重并计算差值?使用
tf.RMSPropOptimizer
函数是否有我缺少的东西


谢谢

您可以将权重添加到事物列表中,以获取每个运行调用。然后您可以计算TensorFlow之外的delta,因为您将有迭代。这应该是相当有效的,尽管它可能会产生额外的元素差异,但为了避免您可能不得不在优化器的内部进行黑客攻击,并在应用更新和获取每个步骤之前找到它将更新放在哪里。获取每个调用的权重至少不应该对图的一部分进行浪费性的额外计算


RMSProp对每个权重的学习率进行复杂的缩放。基本上,它将某个权重的学习率除以该权重最近梯度大小的运行平均值

RMSprop不会从参数中减去梯度,而是使用更复杂的公式,包括:

  • 如果相应的参数不是0,则为动量
  • 梯度步长,通过梯度平方平均值的平方根(在每个坐标上)非均匀地重新缩放
有关更多信息,请参阅或

首先通过时隙变量“动量”中的tensorflow在内存中计算增量,然后更新变量(请参阅)。
因此,您应该能够访问它并使用
delta_w1=self.rmsprop.get_slot(self.w1,'momentum')
构造一个delta节点。(我还没有试过。)

源代码链接:是ApplyRMSProp发生了什么。 feed_dict = `training variables` grad_vals = self.sess.run([grad[0] for grad in self.comp_grads], feed_dict=feed_dict) feed_dict2 = `feed_dict plus gradient values added to self.grad_placeholder` self.sess.run(self.apply_grads, feed_dict=feed_dict2)