Tensorflow - 从指标中选择值,所谓的操作是什么?

时间:2017-02-27 15:26:57

标签: python numpy tensorflow

一个例子

假设我有一个形状为values

的张量(2,2,2)
values = [[[0, 1],[2, 3]],[[4, 5],[6, 7]]]

形状为indicies的张量(2,2)描述了在最里面维度中选择的值

indicies = [[1,0],[0,0]]

然后结果将是具有这些值的(2,2)矩阵

result = [[1,2],[4,6]]

在tensorflow中调用了什么操作以及如何操作?

一般

请注意,上述形状(2,2,2)只是一个示例,可以是任何尺寸。此操作的一些条件:

  • ndim(values) -1 = ndim(indicies)
  • values.shape[:-1] == indicies.shape == result.shape
  • indicies.max() < values.shape[-1] -1

1 个答案:

答案 0 :(得分:0)

我认为您可以使用tf.gather_nd来模仿这一点。您只需将“您的”索引转换为适合tf.gather_nd的表示。以下示例与您的具体示例相关联,即输入形状(2, 2, 2)的张量,但我认为这可以让您了解如何为任意形状的输入张量编写转换,但我不确定它有多容易将实现这一点(没想过太长时间)。此外,我并未声称这是最简单的解决方案。

import tensorflow as tf
import numpy as np

values = np.array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]])
values_tf = tf.constant(values)
indices = np.array([[1, 0], [0, 0]])

converted_idx = []
for k in range(values.shape[0]):
    outer = []
    for l in range(values.shape[1]):
        inds = [k, l, indices[k][l]]
        outer.append(inds)
        print(inds)
    converted_idx.append(outer)

with tf.Session() as sess:
    result = tf.gather_nd(values_tf, converted_idx)
    print(sess.run(result))

打印

[[1 2]
 [4 6]]

编辑:要处理任意形状,这是一个应该有效的递归解决方案(仅在您的示例中测试过):

def convert_idx(last_dim_vals, ori_indices, access_to_ori, depth):
    if depth == len(last_dim_vals.shape) - 1:
        inds = access_to_ori + [ori_indices[tuple(access_to_ori)]]
        return inds

    outer = []
    for k in range(ori_indices.shape[depth]):
        inds = convert_idx(last_dim_vals, ori_indices, access_to_ori + [k], depth + 1)
        outer.append(inds)
    return outer

您可以将此与我发布的原始代码一起使用,如下所示:

...
converted_idx = convert_idx(values, indices, [], 0)
with tf.Session() as sess:
    result = tf.gather_nd(values_tf, converted_idx)
    print(sess.run(result))