张量流:张量的单个元素连接过程中的零除法错误



我目前正在处理一个"四胜制";python中的演员-评论家代理。当我试图通过之前收集的行动概率分布进行反向传播时,我遇到了以下错误:ZeroDivisionError:整数除法或模除以零

我能够重现错误:

import tensorflow as tf
with tf.GradientTape() as tape:
t = tf.Variable([1.])
concat = tf.concat(values=[t[0], t[0]], axis=0)
concat_sum = tf.reduce_sum(concat)
grads = tape.gradient(concat_sum, t)

我知道这个问题在这个代码示例中可能听起来微不足道。为什么这里有一个错误,我仍然无法理解!如果将张量的第一个元素连接起来并最终相加,则不应与相同:

with tf.GradientTape() as tape:
t = tf.Variable([1.])
result = t + t
grads = tape.gradient(result, t)

为什么一个生成有效梯度,而另一个不生成

我在我的CPU(Ubuntu 20.04.3 LTS(上运行Tensorflow 2.7.0版本

当您尝试连接标量时会发生这种情况,这是不受支持的。Tensorflow在急切模式下不会引发错误,这显然是一个错误。建议使用tf.stack:

import tensorflow as tf
with tf.GradientTape() as tape:
t = tf.Variable([1.])
result = t + t
grads = tape.gradient(result, t)
tf.print(grads)
with tf.GradientTape() as tape:
t = tf.Variable([1.])
stack = tf.stack(values=[t[0], t[0]], axis=0)
concat_sum = tf.reduce_sum(stack)
grads = tape.gradient(concat_sum, t)
tf.print(grads)
[2]
[2]