gpt4 book ai didi

tensorflow - 尝试在非持久性磁带仍处于事件状态时调用其上的 tape.gradient

转载 作者:行者123 更新时间:2023-12-03 16:51:10 25 4
gpt4 key购买 nike

为什么 TensorFlow 给我运行时错误(在标题中)?

我正在使用 WinPython3.5.4.2 并安装了 TensorFlow 1.8.0。我一直在关注 https://www.tensorflow.org/get_started/eager 上的教程,直到标题为“训练循环”的部分。

---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-9-e08164fd8374> in <module>()
14 for x, y in train_dataset:
15 # Optimize the model
---> 16 grads = grad(model, x, y)
17 optimizer.apply_gradients(zip(grads, model.variables),
18 global_step=tf.train.get_or_create_global_step())

<ipython-input-7-08164b502799> in grad(model, inputs, targets)
6 with tf.GradientTape() as tape:
7 loss_value = loss(model, inputs, targets)
----> 8 return tape.gradient(loss_value, model.variables)

C:\[deleted]\WinPython3.5.4.2\python-3.5.4.amd64\lib\site-packages\tensorflow\python\eager\backprop.py in gradient(self, target, sources, output_gradients)
765 flat_grad = imperative_grad.imperative_grad(
766 _default_vspace, self._tape, [target], flat_sources,
--> 767 output_gradients=output_gradients)
768
769 if not self._persistent:

C:\[deleted]\WinPython3.5.4.2\python-3.5.4.amd64\lib\site-packages\tensorflow\python\eager\imperative_grad.py in imperative_grad(vspace, tape, target, sources, output_gradients)
61 """
62 return pywrap_tensorflow.TFE_Py_TapeGradient(
---> 63 tape._tape, vspace, target, sources, output_gradients) # pylint: disable=protected-access

RuntimeError: Trying to call tape.gradient on a non-persistent tape while it is still active.

最佳答案

我怀疑在您的示例中,您是在 tape.gradient() 上下文中而不是在其外部调用 with tf.GradientTape() 。更改自:

with tf.GradientTape() as tape:
loss_value = loss(model, inputs, targets)
return tape.gradient(loss_value, model.variables)


with tf.GradientTape() as tape:
loss_value = loss(model, inputs, targets)
# Notice the change in indentation of the line below
return tape.gradient(loss_value, model.variables)

应该导致错误消失。

GradientTape 的上下文中执行的 TensorFlow 操作被“记录”,以便记录的计算可以在以后区分。这种记录会消耗内存(因为中间操作实现的张量必须保持事件状态)。在 tape.gradient() 上下文管理器中调用 GradientTape 意味着梯度计算也应该被记录下来,并且在梯度计算期间创建的张量需要保持事件状态。通常这不是用户想要的 - tape.gradient() 调用只是在上下文管理器中偶然发生,导致比必要的更大的内存占用。因此错误。尽管如此,可以说错误消息字符串的措辞并不是特别好(我相信在 TensorFlow 1.8 之后的版本中会得到改进)。

引自 documentation

By default, the resources held by a GradientTape are released as soon as GradientTape.gradient() method is called. To compute multiple gradients over the same computation, create a persistent gradient tape. This allows multiple calls to the gradient() method as resources are released when the tape object is garbage collected.



因此,如果您确实想要记录梯度计算(例如,计算二阶导数),那么您可以创建一个永久磁带并将 .gradient() 调用保留在上下文管理器中。例如:
x = tfe.Variable(3.0)
with tf.GradientTape(persistent=True) as g:
y = x * x
dy = g.gradient(y, x)
d2y = g.gradient(dy, x)
print(dy)
print(d2y)

Eager execution 是 TensorFlow 中一个相对较新的功能,非常欢迎对它的反馈。如果您认为错误消息可能会更好(可能是!)和/或应该更改默认值(例如,默认情况下是持久的,并且特别关注内存开销的用户可以明确选择非持久磁带) - 不要'毫不犹豫地提供 feedback on GitHub

希望有帮助!

关于tensorflow - 尝试在非持久性磁带仍处于事件状态时调用其上的 tape.gradient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50244706/

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