在 Tensorflow 2.0 中使用 GradientTape() 和 jacobian() 时出错

Posted

技术标签:

【中文标题】在 Tensorflow 2.0 中使用 GradientTape() 和 jacobian() 时出错【英文标题】:Error when working with GradientTape() and jacobian() in Tensorflow 2.0 【发布时间】:2020-04-22 23:49:17 【问题描述】:

我正在使用 Python 中的 Tensorflow 2.0 中的 GradientTape() 和 jacobian()。

这段代码执行得很好:

x = tf.Variable(2.0, dtype=tf.float32)
with tf.GradientTape() as gT:
    gT.watch(x)
    g = tf.convert_to_tensor([x, 0.0], dtype=tf.float32)
dg = gT.jacobian(g, x)

但是这段代码坏了:

x = tf.Variable(2.0, dtype=tf.float32)
with tf.GradientTape() as gT:
    gT.watch(x)
    gv = tf.Variable([x, 0.0], dtype=tf.float32)
    g = tf.convert_to_tensor(gv , dtype=tf.float32)
dg = gT.jacobian(g, x)

并抛出错误:

InvalidArgumentError:您必须使用 dtype int32 为占位符张量“loop_body/Placeholder”提供一个值 [[node loop_body/Placeholder(定义在...Anaconda3\lib\site-packages\tensorflow_core\python\framework\ops.py:1751)]] [Op:__inference_f_995]

模块中的回溯(最近一次调用最后一次)ipython-input-32-686c8a0d6e95 4       gv = tf.Variable([x, 0.0], dtype=tf.float32) 5       g = tf.convert_to_tensor(gv , dtype=tf.float32) ----> 6      dg = gT.jacobian(g, x)

为什么第一个代码有效,而第二个代码无效?

【问题讨论】:

【参考方案1】:

原因很简单,

在第一个例子中,你得到了

g = tf.convert_to_tensor([x, 0.0], dtype=tf.float32)

并且计算 dg/dxgx 有直接关系并且工作正常。

但在第二个例子中,

gv = tf.Variable([x, 0.0], dtype=tf.float32)
g = tf.convert_to_tensor(gv , dtype=tf.float32)

gx 之间不再有任何联系,因为当你打电话时,

gv = tf.Variable([x, 0.0], dtype=tf.float32)

它只是从x 复制值并且不携带对x 的引用,所以你不能得到派生dg/dx。但如果你尝试dg/d(gv),它会起作用。

PS:虽然我没有收到错误消息(对于您的第二个示例)。我刚收到None

【讨论】:

以上是关于在 Tensorflow 2.0 中使用 GradientTape() 和 jacobian() 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow-2.0 中绘制 tf.keras 模型?

如何在 TensorFlow 2.0 中使用 Dataset.window() 方法创建的窗口?

使用 TensorFlow 2.0 Alpha 时无法在 Tensorboard 中看到 keras 模型图

社区分享 | Spark 玩转 TensorFlow 2.0

Anaconda 安装 TensorFlow 1.15 而不是 2.0

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?