0

我正在将一些 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)

但是,我一直在了解g = [None]是否使用tape.watch(f)或创建tf.Variable具有值的af甚至tf.gradients()在 a 内部使用tf.function,否则它会抱怨。

4

1 回答 1

1

很可能是以下情况之一

  1. tf.Variable一个由@tf.funtion?
  2. 一些变量是 numpy.array 而不是 tf.Tensor
  3. 您在装饰函数内更改了一些外部变量(即全局变量)。
于 2021-03-02T06:23:27.903 回答