[英]Is tf.GradientTape in TF 2.0 equivalent to tf.gradients?
[英]Conversion from tf.gradients() to tf.GradientTape() returns None
我正在将一些 TF1 代码迁移到 TF2。 有关完整代码,您可以在此处查看第 [155-176] 行。 TF1 中有一条线在给定损失(浮点值)和 (m, n) 张量的情况下获得梯度
编辑:问题仍然存在
注意: TF2 代码应该兼容并且应该在tf.function
工作
g = tf.gradients(-loss, f) # loss being a float and f being a (m, n) tensor
k = -f_pol / (f + eps) # f_pol another (m, n) tensor and eps a float
k_dot_g = tf.reduce_sum(k * g, axis=-1)
adj = tf.maximum(
0.0,
(tf.reduce_sum(k * g, axis=-1) - delta)
/ (tf.reduce_sum(tf.square(k), axis=-1) + eps),
)
g = g - tf.reshape(adj, [nenvs * nsteps, 1]) * k
grads_f = -g / (nenvs * nsteps)
grads_policy = tf.gradients(f, params, grads_f) # params being the model parameters
在 TF2 代码中,我正在尝试:
with tf.GradientTape() as tape:
f = calculate_f()
f_pol = calculate_f_pol()
others = do_further_calculations()
loss = calculate_loss()
g = tape.gradient(-loss, f)
但是,无论我使用tape.watch(f)
还是创建一个值为f
的tf.Variable
,甚至在tf.function
中使用tf.gradients()
,我都会不断得到g = [None]
,否则它会抱怨。
很可能是以下情况之一
@tf.funtion
tf.Variable
的 function 中区分 tf.Variable 吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.