繁体   English   中英

使用另一个张量进行Tensorflow多维索引

[英]Tensorflow multi-dimensional indexing by another tensor

说,我有一个形状为[n1,n2,...,nk]的秩k张量X和一个形状为[n2,n3,...,nk]的秩(k-1)张量IDX,其中IDX具有与X的最后(k-1)维相同的形状。IDX的条目都是[0,n1)中的所有整数。 我想从X提取一些值,其中第一个维度位置由IDX指定,而其他维度则一直迭代。

例:

X = tf.constant([[1,2], [3,4], [5,6],
                 [7,8], [9,10],[11,12]]) # 2 x 3 x 2 tensor
IDX = tf.constant([[1,0], [1,1], [0,1]]) #     3 x 2 tensor
...
# would like to get [[7,2],[9,10],[5,12]]

如何在Tensorflow中有效实现这一目标? 谢谢!

您是否看到choose的注释?

笔记

为了减少错误解释的机会,即使名义上支持以下“滥用”, choices也不应该也不应被视为单个数组,即,最外面的类似于序列的容器应该是列表或元组。

也就是说,他们希望您将其视为:

In [432]: list(X)
Out[432]: [array([1, 2]), array([3, 4]), array([5, 6])]
In [433]: np.choose(IDX,list(X))
Out[433]: array([3, 6])

等效的索引是:

In [436]: X[IDX,np.arange(2)]
Out[436]: array([3, 6])

choose还具有一些mode选项。

文档还说这等效于(减去这些模式问题):

np.choose(a,c) == np.array([c[a[I]][I] for I in ndi.ndindex(a.shape)])

choose另一个细微差别。 它不能使用超过32个选择。

In [440]: np.choose(IDX,np.ones((33,2)))
...
ValueError: Need at least 1 and at most 32 array objects.

In [442]: np.ones((33,2))[IDX,np.arange(2)]
Out[442]: array([ 1.,  1.])

您可以将np.choose()包装在python函数中,并使用tf.py_func()将其嵌入到张量流图中。 但是,如果您希望对图进行自动梯度计算以进行训练,则还可以为函数定义梯度。 我想,为np.choose()定义梯度可能是非常棘手的任务,即使实际上可以解决的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM