Сопоставить значение в многомерном тензоре с другим значением - PullRequest
0 голосов
/ 09 января 2019

У меня есть 4-мерный тензор целых, я хочу отобразить одно из значений на другое. Я не уверен, что будет эффективным способом сделать это в tenorflow.

Если бы это был простой массив, я бы сделал следующее:

arrayNew = np.zeros(arrayOld.shape, dtype=arrayOld.dtype) arrayNew[arrayOld == valOld] = valNew

Так что я в основном пытаюсь перевести этот код в tenorflow.

1 Ответ

0 голосов
/ 09 января 2019

Если вы просто хотите заменить одно скалярное значение другим, возможно, самый простой способ - вычесть старое значение и добавить новое:

import tensorflow as tf

# Inputs
arrayOld = tf.placeholder(tf.int8)
valOld = tf.placeholder(tf.int8, ())
valNew = tf.placeholder(tf.int8, ())
# Find positions to replace
mask = tf.cast(tf.equal(arrayOld, valOld), arrayOld.dtype)
# Make new array
arrayNew = arrayOld + (valNew - valOld) * mask
with tf.Session() as sess:
    print(sess.run(arrayNew, feed_dict={
        arrayOld: [[12, 20, 32, 17, 20],
                   [31, 15, 20, 25, 14]],
        valOld: 20, valNew: 10}))

Выход:

[[12 10 32 17 10]
 [31 15 10 25 14]]

РЕДАКТИРОВАТЬ: Первоначально, я думал, что строка

arrayNew = arrayOld + (valNew - valOld) * mask

может быть проблематично для типов без знака (из-за вычитания, дающего отрицательные значения), но на самом деле оно работает нормально, отрицательные значения просто переполняются, и результат в итоге получается правильным.

...