我有以下两个Tensor(请注意,它们都是****tensorflow Tensor,这意味着在启动tf.Session()
之前构造以下切片操作时,它们实际上仍然是符号性的):
params
:具有形状(64,784,256)indices
:具有形状(64,784)
我想构造一个运算返回下面的Tensor
output
:具有形状(64,784),其中
output[i,j] = params_tensor[i,j, indices[i,j] ]
在Tensorflow中,实现此目的的最有效方法是什么?
ps:我尝试使用tf.gather
,但无法使用它来执行上面描述的操作。
多谢了。
- 最佳
3条答案
按热度按时间mrwjdhj31#
你可以使用
tf.gather_nd
得到你想要的结果。最后的表达式是:此表达式有以下解释:
tf.gather_nd
执行您所期望的操作,并使用索引从params收集输出tf.stack
组合了三个独立的Tensor,最后一个Tensor是索引。前两个Tensor指定前两个维(参数/索引的轴0和轴1)的顺序。tf.range(tf.shape(indices)[0])
和tf.range(tf.shape(indices)[1])
获得。tf.stack
组合tf.expand_dims
向两个序列中的每一个添加额外的维度/轴。tf.tile
和tf.transpose
的使用可通过示例显示:假设params和index的前两个轴具有形状(5,3)。我们希望第一Tensor为:我们希望第二Tensor为:
这两个Tensor的功能几乎类似于为相关索引指定网格中的坐标。
tf.stack
的最后一部分将三个Tensor组合在一个新的第三个轴上,因此结果具有与params相同的3个轴。请记住,如果您的轴比问题中的轴多或少,您需要相应地修改
tf.stack
中指定坐标的Tensor的数量。xlpyo6sf2#
你需要的是一个自定义的约简函数。如果你要保持
indices
索引,那么我建议使用tf.reduce_max
:否则,这里有一种方法可以得到你想要的(Tensor对象是不可赋值的,所以我们创建一个二维Tensor列表,并使用
tf.pack
打包它):uz75evzq3#
我知道我迟到了,但是我最近不得不做一些类似的事情,并且能够使用Ragged Tensors来完成它:
希望能有所帮助