tensorflow 如何在Tensor中移动值

x759pob2  于 2023-06-24  发布在  其他
关注(0)|答案(3)|浏览(104)

我有形状为[batch_size,A]的TensorT和形状为[batch_size]的TensorS。
我想将T[B]中的值向右移动S[b]个位置,T[b]的最后S[b]个元素应该被丢弃,新的元素应该被设置为0。
所以基本上想做的事情是:

for i in range(batch_size):
  T[i] = zeros[:S[i]] + T[i, :A-S[i]]

示例:

For:
T = [[1, 2, 3], [4, 5, 6]]
S = [1, 2]

Return:
T' = [[0, 1, 2], [0, 0, 4]]

有什么简单的方法吗?

toiithl6

toiithl61#

使用tf.reverse()tf.reverse_sequence(),并使用tf.sequence_mask()应用掩模。
第一种方式:

T = tf.constant([[1, 2, 3], [4, 5, 6]])
S = tf.constant([1, 2])
#expected_out T' = [[0, 1, 2], [0, 0, 4]]

t = tf.reverse_sequence(T, [2,1], seq_axis=1, batch_axis=0)
#[[2, 1, 3], [4, 5, 6]]

t = tf.reverse(t,[1])
#[[3, 1, 2], [6, 5, 4]]

mask = tf.sequence_mask([1,2],3)
t*tf.cast(~mask,"int32")
#[[0, 1, 2], [0, 0, 4]] ##

tf.reverse_sequence()将从每个轴中选择元素的数量,然后反转它们。这里我们选择反转第一个数组中的前两个元素和第二个数组中的第一个元素。然后我们颠倒了整个序列,因为我们希望第一个元素移动到Tensor的末尾。这就说明了第一次逆转的重要性,因为在第二次逆转中,它们将恢复到原来的顺序。然后,我们应用掩模以使第一不需要的元素= 0。
这个方法是灵活的,你可以选择你想要左移你的序列中每个元素的数量,并将它与你代码中的掩码相关联。

kx7yvsdv

kx7yvsdv2#

你可以使用tf.concat和tf.stack来实现这个目的:

T_shift = tf.zeros((batch_size, A), tf.float32)
tmp = []

for i in xrange(batch_size):
    tmp.append(tf.concat([T_shift[i, :S[i, 0]],T[i, :17 - S[i,0]]], axis = 0))
T_shift = tf.stack(tmp)
vtwuwzda

vtwuwzda3#

如果你在Tensorflow 2中工作,你可以使用tf.roll来实现这个目的:
“元素通过沿着轴的维度的移位的偏移而正移位(朝向更大的索引)。负偏移值将使元素向相反方向偏移。滚动经过最后一个位置的元素将环绕到第一个位置,反之亦然。可以指定沿着多个轴的多个移位。”

tf.roll(
       input, shift, axis, name=None
)

# 't' is [0, 1, 2, 3, 4]
roll(t, shift=2, axis=0) ==> [3, 4, 0, 1, 2]

# shifting along multiple dimensions
# 't' is [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
roll(t, shift=[1, -2], axis=[0, 1]) ==> [[7, 8, 9, 5, 6], [2, 3, 4, 0, 1]]

# shifting along the same axis multiple times
# 't' is [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
roll(t, shift=[2, -3], axis=[1, 1]) ==> [[1, 2, 3, 4, 0], [6, 7, 8, 9, 5]]

相关问题