如何使用 GradientDescentOptimizer 计算 grads_and_vars

How to compute grads_and_vars with GradientDescentOptimizer

我有以下 CNN 代码实现。

optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate).minimize(loss = cnn.loss, global_step=global_step)
grads_and_vars = optimizer.compute_gradients(cnn.loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

使用它,我得到以下错误:

grads_and_vars = optimizer.compute_gradients(cnn.loss)
AttributeError: 'Operation' object has no attribute 'compute_gradients'

我注意到将上面的 GradientDescentOptimizer 实现与 tf.train.exponential_decay 一起使用不提供属性 'compute_gradients' 对于优化器。

有人可以帮我解决这个问题吗?

compute_gradientsapply_gradients都是tf.train.GradientDescentOptimizerclass的方法。

问题是您将优化器定义为步骤。您应该删除 minimize 调用,如下所示:

optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate)
grads_and_vars = optimizer.compute_gradients(cnn.loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

它应该可以工作。

但是,如果您没有对梯度进行任何特定使用,您确实可以使用 .minimize(...) 直接定义训练步骤,类似于您的 train_op:

optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate)
train_op = optimizer.minimize(loss=cnn.loss, global_step=global_step)

进一步解释 apply_gradients 的工作原理

随意查看tensorflow中optimizer.py的源码(路径:/tensorflow/tensorflow/python/training/optimizer.py),你就会得到答案。

代码片段,即第365行到第423行是.minimize()函数的实现。别担心,这些大部分都是笔记。实际上,它同时执行 .compute_gradients().apply_gradients()。所以如果你想单独调用 .compute_gradients() ,你必须确保变量是 tf.train.GradientDescentOptimizer().

的实例