张量流中优化器的"apply_gradients"和"最小化"之间的区别

Pan*_* Li 28 tensorflow

我感到困惑之间的差异apply_gradients,并minimize在tensorflow优化的.例如,

optimizer = tf.train.AdamOptimizer(1e-3)
grads_and_vars = optimizer.compute_gradients(cnn.loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)
Run Code Online (Sandbox Code Playgroud)

optimizer = tf.train.AdamOptimizer(1e-3)
train_op = optimizer.minimize(cnn.loss, global_step=global_step)
Run Code Online (Sandbox Code Playgroud)

他们确实一样吗?

如果我想降低学习率,我可以使用以下代码吗?

global_step = tf.Variable(0, name="global_step", trainable=False)
starter_learning_rate = 1e-3
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
                                       100, FLAGS.decay_rate, staircase=True)
# Passing global_step to minimize() will increment it at each step.
learning_step = (
    optimizer = tf.train.AdamOptimizer(learning_rate)
    grads_and_vars = optimizer.compute_gradients(cnn.loss)
    train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)
)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Yan*_*oon 20

您可以从链接中轻松了解:https ://www.tensorflow.org/get_started/get_started(tf.train API部分),他们实际上做同样的工作.不同之处在于:如果使用分离的函数(tf.gradients,tf.apply_gradients),则可以在它们之间应用其他机制,例如渐变剪切.

  • 更好地解释的文档链接是 https://www.tensorflow.org/api_docs/python/tf/train/Optimizer 。 (2认同)

Agu*_*ina 6

这里它说minimize使用tf.GradienTape然后apply_gradients

通过更新 var_list 将损失降至最低。

此方法只是使用 tf.GradientTape 计算梯度并调用 apply_gradients()。如果您想在应用之前处理渐变,请显式调用 tf.GradientTape 和 apply_gradients() 而不是使用此函数。

所以minimize实际上使用apply_gradients就像:

def minimize(self, loss, var_list, grad_loss=None, name=None, tape=None):
    grads_and_vars = self._compute_gradients(loss, var_list=var_list, grad_loss=grad_loss, tape=tape)
    return self.apply_gradients(grads_and_vars, name=name)
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您使用compute_gradientsand apply_gradients,这确实是有效的,但现在compute_gradients已被设为私有,因此不是使用它的好习惯。因此,该函数不再出现在文档中。