问题:在 TensorFlow 网络中以最有效的方式获得权重增量的最有效方法是什么?
背景 :我已经按如下方式连接了运算符(operator)(感谢这个 SO question ):
self.cost = `网络的其余部分`
self.rmsprop = tf.train.RMSPropOptimizer(lr,rms_decay,0.0,rms_eps)
self.comp_grads = self.rmsprop.compute_gradients(self.cost)
self.grad_placeholder = [(tf.placeholder("float", shape=grad[1].get_shape(), name="grad_placeholder"), grad[1]) for grad in self.comp_grads]
self.apply_grads = self.rmsprop.apply_gradients(self.grad_placeholder)
现在,为了提供信息,我运行以下命令:
feed_dict = `训练变量`
grad_vals = self.sess.run([grad[0] for grad in self.comp_grads], feed_dict=feed_dict)
feed_dict2 = `feed_dict 加上添加到 self.grad_placeholder` 的梯度值
self.sess.run(self.apply_grads,feed_dict=feed_dict2)run(self.apply_grads)
的命令将更新网络权重,但是当我计算开始和结束权重的差异( run(self.w1)
)时,这些数字与存储在 grad_vals[0]
中的数字不同.我认为这是因为 RMSPropOptimizer 对原始梯度做了更多的工作,但我不确定是什么,或者在哪里可以找到它的作用。
所以回到问题:如何以最有效的方式获得权重的增量?我是否坚持运行 self.w1.eval(sess)
多次获得权重并计算差异? tf.RMSPropOptimizer
有什么我遗漏的地方吗?功能。
谢谢!
最佳答案
RMSprop 不会从参数中减去梯度,而是使用包含以下组合的更复杂的公式:
更多信息可以引用these slides或 this recent paper .
delta 首先在内存中由槽变量“momentum”中的 tensorflow 计算,然后变量被更新(参见 the C++ operator)。
因此,您应该能够访问它并使用
delta_w1 = self.rmsprop.get_slot(self.w1, 'momentum')
构造一个增量节点。 . (我还没有尝试过。)
关于Tensorflow:opt.compute_gradients() 返回的值不同于 opt.apply_gradients() 的权重差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123745/