gpt4 book ai didi

python - tf.Variable 分配方法破坏了 tf.GradientTape

转载 作者:太空宇宙 更新时间:2023-11-03 19:58:24 24 4
gpt4 key购买 nike

当我使用 tf.Variable 的分配方法来更改变量的值时,它会阻止 tf.Gradient,例如。例如,请参阅下面的玩具示例代码:

(注意:我只对 TensorFlow 2 感兴趣。)

x = tf.Variable([[2.0,3.0,4.0], [1.,10.,100.]])
patch = tf.Variable([[0., 1.], [2., 3.]])
with tf.GradientTape() as g:
g.watch(patch)
x[:2,:2].assign(patch)
y = tf.tensordot(x, tf.transpose(x), axes=1)
o = tf.reduce_mean(y)
do_dpatch = g.gradient(o, patch)

然后它为我提供了 do_dpatchNone

请注意,如果我执行以下操作,它就可以正常工作:

x = tf.Variable([[2.0,3.0,4.0], [1.,10.,100.]])
patch = tf.Variable([[0., 1.], [2., 3.]])
with tf.GradientTape() as g:
g.watch(patch)
x[:2,:2].assign(patch)
y = tf.tensordot(x, tf.transpose(x), axes=1)
o = tf.reduce_mean(y)
do_dx = g.gradient(o, x)

并给我:

>>>do_dx 
<tf.Tensor: id=106, shape=(2, 3), dtype=float32, numpy=
array([[ 1., 2., 52.],
[ 1., 2., 52.]], dtype=float32)>

最佳答案

这种行为确实有道理。让我们来看第一个例子

x = tf.Variable([[2.0,3.0,4.0], [1.,10.,100.]])
patch = tf.Variable([[1., 1.], [1., 1.]])
with tf.GradientTape() as g:
g.watch(patch)
x[:2,:2].assign(patch)
y = tf.tensordot(x, tf.transpose(x), axes=1)
dy_dx = g.gradient(y, patch)

您正在计算 dy/d(patch)。但是你的y仅依赖于x而不是patch。是的,您确实从 patchx 赋值。但此操作不携带对 patch 变量的引用。它只是复制值。

简而言之,您正在尝试获得与它不依赖的东西相关的渐变。所以你会得到None

让我们看一下第二个示例以及它的工作原理。

x = tf.Variable([[2.0,3.0,4.0], [1.,10.,100.]])
with tf.GradientTape() as g:
g.watch(x)
x[:2,:2].assign([[1., 1.], [1., 1.]])
y = tf.tensordot(x, tf.transpose(x), axes=1)
dy_dx = g.gradient(y, x)

这个例子非常好。 Y 取决于 x,您正在计算 dy/dx。因此,在此示例中您将获得实际的渐变。

关于python - tf.Variable 分配方法破坏了 tf.GradientTape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59412483/

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