TensorFlow-类似于numpy的张量索引
python
tensorflow
6
0

在numpy中,我们可以这样做:

x = np.random.random((10,10))
a = np.random.randint(0,10,5)
b = np.random.randint(0,10,5)
x[a,b] # gives 5 entries from x, indexed according to the corresponding entries in a and b

当我在TensorFlow中尝试等效的东西时:

xt = tf.constant(x)
at = tf.constant(a)
bt = tf.constant(b)
xt[at,bt]

最后一行给出了“错误的切片索引张量”异常。 TensorFlow似乎不支持numpy或Theano等索引。

是否有人知道是否有TensorFlow方式(通过任意值索引张量)。我看过tf.nn.embedding部分,但是我不确定它们是否可以用于此目的,即使可以使用,对于这种简单的操作来说,这也是一个巨大的解决方法。

(现在,我正在将x的数据作为输入并在numpy中进行索引,但我希望将x放入TensorFlow中以获得更高的效率)

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

对于Tensorflow 0.11 ,已实现基本索引。仍然缺少更高级的索引编制(如布尔索引编制),但显然计划在将来的版本中使用。

可以使用https://github.com/tensorflow/tensorflow/issues/4638跟踪高级索引

收藏
评论

实际上,您现在可以使用tf.gather_nd 。假设您有一个矩阵m ,如下所示:

| 1 2 3 4 |
| 5 6 7 8 |

您想要构建一个由m元素构建的大小为3x2的矩阵r ,如下所示:

| 3 6 |
| 2 7 |
| 5 3 |
| 1 1 |

的每个元素r对应的行和列m ,你可以有矩阵rowscols与这些指数(从零开始,因为我们是编程,而不是做数学!):

       | 0 1 |         | 2 1 |
rows = | 0 1 |  cols = | 1 2 |
       | 1 0 |         | 0 2 |
       | 0 0 |         | 0 0 |

您可以将其堆叠成3维张量,如下所示:

| | 0 2 | | 1 1 | |
| | 0 1 | | 1 2 | |
| | 1 0 | | 2 0 | |
| | 0 0 | | 0 0 | |

通过这种方式,你可以从mr通过rowscols如下:

import numpy as np
import tensorflow as tf

m = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
rows = np.array([[0, 1], [0, 1], [1, 0], [0, 0]])
cols = np.array([[2, 1], [1, 2], [0, 2], [0, 0]])

x = tf.placeholder('float32', (None, None))
idx1 = tf.placeholder('int32', (None, None))
idx2 = tf.placeholder('int32', (None, None))
result = tf.gather_nd(x, tf.stack((idx1, idx2), -1))

with tf.Session() as sess:
    r = sess.run(result, feed_dict={
        x: m,
        idx1: rows,
        idx2: cols,
    })
print(r)

输出:

[[ 3.  6.]
 [ 2.  7.]
 [ 5.  3.]
 [ 1.  1.]]
收藏
评论

LDGN的评论是正确的。目前尚不可能,这是一项必需的功能。如果您在github上关注issue#206,则在有可用更新时会得到更新。许多人都希望使用此功能。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号