#python #tensorflow #math #keras
Вопрос:
У меня есть следующая функция (см. Ниже). В качестве аргумента он принимает (N,8,3) тензор. Мне нужно выбрать вдоль оси 0 и 2, поэтому я получаю выбор с размером (N,1,3) из вероятностей вдоль оси 1.
Я решил эту проблему с tf.random.categorical
помощью . К сожалению, для этой функции необходимо заранее рассчитать вектор вдоль оси 1 tf.log(vector)
. (Я не вижу причины, но так говорят документы).
Теперь это вычисляет логин на месте, поэтому он уничтожает мои аргументы извне.
- Я не могу скопировать тензор.
copy = tf.constant(move)
это невозможно, потому что движение-это тензор. - Я не могу exp(ln(переместить)), потому что я получаю NANS после.
- Я не могу использовать Numpy, потому что он находится внутри функции tf. (Графический процессор, но 32-битный)
Как можно вычислить логарифм не на месте (или выбрать из вероятности без log(prop)
) ?
Спасибо
@tf.function
def convert_to_move(move):
# copy = tf.constant(move) <--- this is not supported by tensorflow.
# move = tf.math.log(move) <--- this errors if move==0. not direct but recreate with exp. is not possible
m1 = move[:, :, 0]
m2 = move[:, :, 1]
m3 = move[:, :, 2]
x1 = tf.random.categorical(m1, num_samples=1)
x2 = tf.random.categorical(m2, num_samples=1)
x3 = tf.random.categorical(m3, num_samples=1)
# move = tf.exp(move)
# x1 = tf.argmax(movetensors[0], axis=1)
# x2 = tf.argmax(movetensors[1], axis=1)
# x3 = tf.argmax(movetensors[2], axis=1)
r1 = tf.squeeze(tf.one_hot(x1, move.shape[1]))
r2 = tf.squeeze(tf.one_hot(x2, move.shape[1]))
r3 = tf.squeeze(tf.one_hot(x3, move.shape[1]))
p1 = tf.boolean_mask(move[:, :, 0], r1)
p2 = tf.boolean_mask(move[:, :, 2], r2)
p3 = tf.boolean_mask(move[:, :, 3], r3)
k1 = tf.stack([x1, x2, x3], axis=-1)
k2 = tf.stack([p1, p2, p3], axis=-1)
return tf.squeeze(k1), tf.squeeze(k2)
Комментарии:
1. Какова ваша версия tensorflow? почему это разрушит аргумент извне? Я запустил ваш код как в tf1, так и в tf2, функция convert_to_move не влияет на внешний тензор. Не могли бы вы дать больше кода для воспроизведения вашей проблемы?
2. Моя версия 2.6. Я очень уверен, что у меня была эта ошибка, но я не могу воспроизвести ее сейчас, и я не тот, кто бежит в stackoverflow и сразу же спрашивает. Были отрицательные значения softmax, и моим единственным объяснением / решением было избавиться от tf.log , но, похоже, я допустил ошибку. мне жаль отнимать у вас время, спасибо, что вы попробовали !