如何根据索引的张量过滤tensorflow的Tensor?

时间:2017-05-30 15:13:54

标签: python machine-learning tensorflow

假设我有一个名为@foreach (var song in (IEnumerable<Tuple<Song, Artist>) ViewData["songs"]) { var item = song.Item1; var artist = song.Item2; 的张量为[batch_size, 5, 10]的张量。 我还有另一个大小为my_tensor的张量保持索引[batch_size, 1]

我希望针对selecter过滤my_tensor以生成新的张量selecter,即仅选择[batch_size, 10]包含的值。基本上,它有点减少中间维度(大小为5)。

我觉得selecter是正确的选择,但不确定。 我真的很感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

解决方案是使用tf.gather_nd

tf.gather_nd(
    my_tensor,
    tf.stack([tf.range(batch_size), tf.squeeze(selecter)], axis=-1))

如果您从一开始就将squeeze构建为1-D,则可以摆脱selecter

答案 1 :(得分:0)

替代解决方案,适用于Tensorflow 1.3:

max_selecter = tf.reduce_max(selecter) + 1
my_tensor = tf.boolean_mask(
    outputs,
    tf.logical_xor(
        tf.sequence_mask(my_tensor + 1, max_selecter),
        tf.sequence_mask(my_tensor, max_selecter)
    )
)