Tensorflow:张量的单个元素连接期间的 ZeroDivisionError

Tensorflow: ZeroDivisionError during concat of singel elements of tensor

我目前正在 python 制作一个“四胜”演员评论家。在尝试反向传播之前收集的动作概率分布时,我遇到了以下错误:ZeroDivisionError: integer division or modulo by zero

我能够重现错误:

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)

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

我 运行 Tensorflow 版本 2.7.0 CPU (Ubuntu 20.04.3 LTS)

当您尝试连接不受支持的标量时会发生这种情况。 Tensorflow 不会在 eager 模式下引发错误,这显然是一个错误。 suggestion 宁可使用 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]