Как вставить определенные значения при определенных показателях тензора в тензорном потоке? - PullRequest
3 голосов
/ 18 июня 2019

Допустим, у меня есть тензор input формы 100x1 и еще один тензор inplace формы 20x1 и index_tensor формы 100x1. index_tensor представляет места input, в которые я хочу вставить значения из inplace. index_tensor имеет только 20 значений True, а остальные значения - False. Я пытаюсь объяснить желаемую операцию ниже. enter image description here Как эта операция может быть достигнута с помощью тензорного потока.

assign операция работает только для tf.Variable, хотя я хочу применить ее к выводу tf.nn.rnn.

Я читал, можно использовать tf.scatter_nd, но для этого требуется, чтобы inplace и index_tensor имели одинаковую форму.

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

Любое предложение будет по достоинству оценено.

1 Ответ

0 голосов
/ 18 июня 2019

Поскольку тензор, который у вас есть, является неизменным, вы не можете ни присвоить ему новое значение, ни изменить его на месте. Что вам нужно сделать, это изменить его значение с помощью стандартных операций. Вот как это можно сделать:

input_array = np.array([2, 4, 7, 11, 3, 8, 9, 19, 11, 7])
inplace_array = np.array([10, 20])
indices_array = np.array([0, 0, 1, 0, 0, 0, 1, 0, 0, 0])
# [[2], [6]] 
indices = tf.cast(tf.where(tf.equal(indices_array, 1)), tf.int32)
# [0, 0, 10, 0, 0, 0, 20, 0, 0, 0]
scatter = tf.scatter_nd(indices, inplace_array, shape=tf.shape(input_array))
# [1, 1, 0, 1, 1, 1, 0, 1, 1, 1]
inverse_mask = tf.cast(tf.math.logical_not(indices_array), tf.int32)
# [2, 4, 0, 11, 3, 8, 0, 19, 11, 7]
input_array_zero_out = tf.multiply(inverse_mask, input_array)
# [2, 4, 10, 11, 3, 8, 20, 19, 11, 7]
output = tf.add(input_array_zero_out, tf.cast(scatter, tf.int32))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...