TF 2.0 中的 tf.GradientTape 是否等同于 tf.gradients?
Is tf.GradientTape in TF 2.0 equivalent to tf.gradients?
我正在将我的训练循环迁移到 Tensorflow 2.0 API. In eager execution mode, tf.GradientTape
replaces tf.gradients
。问题是,它们是否具有相同的功能? 具体来说:
函数中gradient()
:
- 参数
output_gradients
是否等同于旧API中的grad_ys
?
- 参数呢
colocate_gradients_with_ops
。 aggregation_method
、gate_gradients
共 tf.gradients
?它们是否由于缺乏使用而被弃用? 2.0 API 可以用其他方法代替吗? Eager Execution 是否需要它们?
函数jacobian()
是否等同于tf.python.ops.parallel_for.gradients
?
请在下面找到回复。
- 关于
Output Gradients
和grad_ys
:是的,可以认为它们是一样的。
详细说明:在Github -> imperative_grad.py中提到了关于Output Gradients
的信息,如下所示。
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_gradients
或 grad_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)
- 关于
colocate_gradients_with_ops
:是的,Eager Execution 不需要它,因为它与图形的控制流上下文相关。
详细解释:colocate_gradients_with_ops
指向下面Github -> ops.py. Control flow Context is related to the concept of Context, which is related to Graphs, as explained in 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
关于aggregation_method
:这个参数的等价物已经在2.0中实现,命名为_aggregate_grads
,如Github link
[=62所示=]
关于 gate_gradients
:Eager 不需要,因为这也与 Graph Context 相关。
详细说明:如下面代码所示Github -> gradients_utils.py,如果gate_gradients
是True
,则使用函数 _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)
- 关于
jacobian
:是的,它们是一样的。
我正在将我的训练循环迁移到 Tensorflow 2.0 API. In eager execution mode, tf.GradientTape
replaces tf.gradients
。问题是,它们是否具有相同的功能? 具体来说:
函数中
gradient()
:- 参数
output_gradients
是否等同于旧API中的grad_ys
? - 参数呢
colocate_gradients_with_ops
。aggregation_method
、gate_gradients
共tf.gradients
?它们是否由于缺乏使用而被弃用? 2.0 API 可以用其他方法代替吗? Eager Execution 是否需要它们?
- 参数
函数
jacobian()
是否等同于tf.python.ops.parallel_for.gradients
?
请在下面找到回复。
- 关于
Output Gradients
和grad_ys
:是的,可以认为它们是一样的。
详细说明:在Github -> imperative_grad.py中提到了关于Output Gradients
的信息,如下所示。
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_gradients
或 grad_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)
- 关于
colocate_gradients_with_ops
:是的,Eager Execution 不需要它,因为它与图形的控制流上下文相关。
详细解释:colocate_gradients_with_ops
指向下面Github -> ops.py. Control flow Context is related to the concept of Context, which is related to Graphs, as explained in 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
关于
[=62所示=]aggregation_method
:这个参数的等价物已经在2.0中实现,命名为_aggregate_grads
,如Github link关于
gate_gradients
:Eager 不需要,因为这也与 Graph Context 相关。
详细说明:如下面代码所示Github -> gradients_utils.py,如果gate_gradients
是True
,则使用函数 _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)
- 关于
jacobian
:是的,它们是一样的。