我有一个示例代码要运行:
import numpy a np
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
x = np.random.randint(100,size=(4,4))
indexes =tf.sequence_mask([1,2,2,4],4)
"""
indexes = [
[True,False,False,False],
[True,True,False,False],
[True,True,False,False],
[True,True,True,True],
]
"""
y = tf.boolean_mask(x,indexes)
# y = array([43, 78, 68, 54, 46, 28, 15, 52, 3])
现在,我不希望这样,因为原始张量的空间信息丢失了,我想保持形状完整。怎么能在tensorflow中做到这一点,因为我使用RNN数据所以我的张量大小是= [batch_size, max_time, feature_length]
我将它切成这样:
indexes = tf.sequence_mask([x_1, x_2, x_3, ..., x_batch_size], max_time)
但仍希望保持形状完整。如果它不可能,有没有办法在这样大小的多个张量上对掩码进行排序,同时还连接它们,以便只保留提取的序列而不是掩盖的填充?可以在连接的末尾应用填充。
答案 0 :(得分:0)
这可能有效-
x = tf.constant([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
indexes = tf.sequence_mask([1, 2, 2, 4], 4)
y = tf.multiply(x, tf.cast(indexes, x.dtype))
-> y is [[ 1 0 0 0]
[ 5 6 0 0]
[ 9 10 0 0]
[13 14 15 16]]
答案 1 :(得分:0)
ragged tensor可能会对您有所帮助,尽管这取决于您使用结果的方式(我在下面使用“ j”代替“ x”):
>>>j = np.random.randint(100,size=(4,4))
>>>indexes =tf.sequence_mask([1,2,2,4],4)
>>>tf.ragged.boolean_mask(j, indexes)
<tf.RaggedTensor [[75], [11, 8], [20, 40], [24, 30, 75, 77]]>