Tensorflow: ошибка нулевого разделения при объединении отдельных элементов тензора

#python #tensorflow #tensor #tensorflow2.x

#python #tensorflow #тензор #tensorflow2.x

Вопрос:

В настоящее время я работаю над агентом-критиком «четыре победы» в 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)
 

Почему один генерирует допустимые градиенты, а другой нет?

Я использую Tensorflow версии 2.7.0 на своем процессоре (Ubuntu 20.04.3 LTS)

Ответ №1:

Это происходит, когда вы пытаетесь объединить скаляры, что не поддерживается. 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]