Вычислить логарифм в тензорном потоке не на месте

#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 , но, похоже, я допустил ошибку. мне жаль отнимать у вас время, спасибо, что вы попробовали !