#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]