Arrays tensorflow创建不同长度的遮罩

Arrays tensorflow创建不同长度的遮罩,arrays,masking,tensorflow,Arrays,Masking,Tensorflow,在tensorflow中有一个长度张量,假设它是这样的: [4, 3, 5, 2] 我希望创建一个包含1和0的掩码,其1的数量对应于这个张量的条目,由0填充,总长度为8。也就是说,我想创建这个张量: [[1,1,1,1,0,0,0,0], [1,1,1,0,0,0,0,0], [1,1,1,1,1,0,0,0], [1,1,0,0,0,0,0,0] ] 我可以如何做到这一点?这可以通过以下多种方式实现: 我得到的版本比之前的答案要短一点。不确定它是否更有效 def mask(self

在tensorflow中有一个长度张量,假设它是这样的:

[4, 3, 5, 2]
我希望创建一个包含1和0的掩码,其1的数量对应于这个张量的条目,由0填充,总长度为8。也就是说,我想创建这个张量:

[[1,1,1,1,0,0,0,0],
 [1,1,1,0,0,0,0,0],
 [1,1,1,1,1,0,0,0],
 [1,1,0,0,0,0,0,0]
]

我可以如何做到这一点?

这可以通过以下多种方式实现:


我得到的版本比之前的答案要短一点。不确定它是否更有效

 def mask(self, seq_length, max_seq_length):
    return tf.map_fn(
        lambda x: tf.pad(tf.ones([x], dtype=tf.int32), [[0, max_seq_length - x]]),
        seq_length)

这可以通过
tf.sequence\u mask
实现。更多详细信息。

不错,但是将
mask
的布尔值强制转换为int或者直接使用它们而不是使用
tf不是更有效吗?在最后一行选择
?当然!我想我过去在C编程方面的经验意味着我从未期望bool的int-casting工作:),但我相信这在TensorFlow中有很好的定义。还有
tf.zeros_like(mask)
,它将创建一个零初始化的张量形状的张量
mask
。你需要平铺吗?
tf.less
会自动为你播放吗?显然你不会。谢谢你的建议!
 def mask(self, seq_length, max_seq_length):
    return tf.map_fn(
        lambda x: tf.pad(tf.ones([x], dtype=tf.int32), [[0, max_seq_length - x]]),
        seq_length)