如何在张量流的张量的某些索引处插入某些值?

时间:2019-06-18 18:34:39

标签: python tensorflow keras mutable tensor

假设我有一个input形的张量100x1和另一个inplace形的张量20x1和一个index_tensor形的100x1index_tensor代表我要插入input中的值的inplace的位置。 index_tensor只有20个True值,其余值为False。我尝试在下面解释所需的操作。 enter image description here如何使用张量流实现此操作。

assign操作仅适用于tf.Variable,而我想将其应用于tf.nn.rnn的输出。

我读到可以使用tf.scatter_nd,但是它要求inplaceindex_tensor的形状相同。

我要使用它的原因是我从rnn获得了一个输出,然后从中提取了一些值并将它们馈送到某个稠密层,并且从稠密层中获得了此输出,我想重新插入原始张量从rnn操作获得。由于某些原因,我不想对rnn的整个输出应用密集层操作,如果我不将密集层的结果插回到rnn的输出中,那么密集层是无用的。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于张量是不可变的,因此无法为其分配新值或就位更改。您要做的就是使用标准操作修改其值。以下是您的操作方法:

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))