Tensorflow序列掩码,不减小尺寸

时间:2018-03-25 15:19:07

标签: python tensorflow

我有一个示例代码要运行:

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)

但仍希望保持形状完整。如果它不可能,有没有办法在这样大小的多个张量上对掩码进行排序,同时还连接它们,以便只保留提取的序列而不是掩盖的填充?可以在连接的末尾应用填充。

2 个答案:

答案 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]]>