如果我有一个形状为“ batch_size *长度* hidden_size”的张量,并且我有另一个形状为“ batch_size * 2”的索引跨度张量,其中索引跨度张量表示我要从中选择的开始和结束索引第一张量。说索引范围张量是否具有值
[[1,3], [2, 4]]
然后我要从第一个张量获得以下蒙版
[[0, 1, 1, 1, 0, 0, ...], [0, 0, 1, 1, 1, 0, 0, ...]]
是否可以使用Tensorflow做到这一点?
答案 0 :(得分:0)
我们可以结合使用range
(以获取索引)和tf.sparse_to_dense
(以填充索引)获得上述my:
batch_size = 2
length_hidden_size = 10
# Use range to populate the indices
r = tf.map_fn(lambda x: tf.range(x[0], x[1]+1),a)
# convert to full indices
mesh = tf.meshgrid(tf.range(tf.shape(r)[1]), tf.range(tf.shape(r)[0]))[1]
full_indices = tf.reshape(tf.stack([mesh, r], axis=2), [-1,2])
# Set 1s to the full indices
val = tf.ones(tf.shape(full_indices)[0])
dense = tf.sparse_to_dense(full_indices,tf.constant([batch_size,length_hidden_size]), val, validate_indices=False)
with tf.Session() as sess:
print(sess.run(dense))
#[[0. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
# [0. 0. 1. 1. 1. 0. 0. 0. 0. 0.]]