gpt4 book ai didi

python - TF 2.0 中的 tf.GradientTape 是否等同于 tf.gradients?

转载 作者:太空狗 更新时间:2023-10-30 00:12:28 27 4
gpt4 key购买 nike

我正在将我的训练循环迁移到 Tensorflow 2.0 API .在急切执行模式下,tf.GradientTape替换 tf.gradients .问题是,它们是否具有相同的功能?具体来说:

  • 在函数中 gradient() :

    • 参数output_gradients是否等同于旧API中的grad_ys
    • 关于参数colocate_gradients_with_opsaggregation_methodgate_gradients tf.gradients ?它们是否由于缺乏使用而被弃用? 2.0 API 可以用其他方法代替吗? Eager Execution 是否需要它们?
  • 函数 jacobian() 是否等同于 tf.python.ops.parallel_for.gradients

最佳答案

请在下面找到回复。

  1. 关于 Output Gradientsgrad_ys:是的,它们可以被认为是相同的。

详细说明:关于Output Gradients的信息在Github -> imperative_grad.py中提到如下所示。

output_gradients: if not None, a list of gradient provided for each Target, or None if we are to use the target's computed downstream gradient,

关于 grad_ys 的信息在 TF Site 中提到如下图:

grad_ys: is a list of tensors of the same length as ys that holds the initial gradients for each y in ys. When grad_ys is None, we fill in a tensor of '1's of the shape of y for each y in ys. A user can provide their own initial grad_ys to compute the derivatives using a different initial gradient for each y (e.g., if one wanted to weight the gradient differently for each value in each y).

从上面的解释和下面的代码中,在本书的第 394 页中提到,Hands on ML using Scikit-Learn & Tensorflow ,我们可以得出结论,Theta 的初始值可以是一个随机值,我们可以使用参数 output_gradientsgrad_ys 传递它。

theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name="theta")
gradients = tf.gradients(mse, [theta])[0]
training_op = tf.assign(theta, theta - learning_rate * gradients)
  1. 关于 colocate_gradients_with_ops:是的,Eager Execution 不需要它,因为它与图形的控制流上下文相关。

详细解释:colocate_gradients_with_ops指向Github -> ops.py中提到的以下代码. Control flow Context与Context的概念相关,后者与Graphs相关,详见TF Site -> Graphs

 def _colocate_with_for_gradient(self, op, gradient_uid,
ignore_existing=False):
with self.colocate_with(op, ignore_existing):
if gradient_uid is not None and self._control_flow_context is not None:
self._control_flow_context.EnterGradientColocation(op, gradient_uid)
try:
yield
finally:
self._control_flow_context.ExitGradientColocation(op, gradient_uid)
else:
yield
  1. 关于aggregation_method:此参数的等效项已在 2.0 中实现,名为 _aggregate_grads,如 Github link 所示。

  2. 关于 gate_gradients:Eager 不需要,因为这也与 Graph Context 相关。

详细说明:如下代码来自Github -> gradients_utils.py ,如果 gate_gradientsTrue,则使用函数 _colocate_with_for_gradient 将一些操作添加到图形中,这又取决于图形的控制流上下文.

if gate_gradients and len([x for x in in_grads
if x is not None]) > 1:
with ops.device(None):
with ops._colocate_with_for_gradient( # pylint: disable=protected-access
None,
gradient_uid,
ignore_existing=True):
in_grads = control_flow_ops.tuple(in_grads)
  1. 关于jacobian:是的,它们是一样的。

关于python - TF 2.0 中的 tf.GradientTape 是否等同于 tf.gradients?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55380219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com