n维张量中的最大张量(非元素)

时间:2017-08-17 17:28:29

标签: tensorflow max tensor

我发现无法在n维数组中得到最大张量,即使通过求和张量并使用gather或gather_nd也是如此。

最大张量是指具有最高总和的权重集。

我有一个形状的张量(-1,4,30,256),其中256是权重。

我需要获得每个(-1,0,30),( - 1,1,30),( - 1,2,30)和( - 1,3,30)的最大权重集,所以在第二维的每个张量下。

这理想情况下会产生(-1,4,256)张量。

reduce_max和任何其他max函数将仅返回最后一维中的最大元素值,而不是维度本身中的最大张量(具有最高总和的权重集)。我试过了:

p1 = tf.reduce_sum(tensor, axis=3) # (-1, 4, 30)
p2 = tf.argmax(p1, 2) # (-1, 4)

其中给出了第三维的适当索引值:

[[0, 2, 2, 0],
 [0, 1, 3, 0],
 ...

但是,即使在预先拆分我的数据并使用不同的轴时,在上面运行tf.gather或tf.gather_nd也不起作用。

此外,如果我手动使用gather_nd,我可以获得适当的索引,例如:

tf.gather_nd(out5, [[0,0,0], [0,1,2], [0,2,2], [0,3,0], [1,0,0], [1,1,2], [1,2,2], [1,3,1]]) 

但是由于我们使用的是未知第一维的张量流变量,我无法构建这些索引。

我搜索了相关的解决方法,但未发现任何适用的内容。

谁能告诉我怎么做到这一点?谢谢!

编辑以澄清:

权重的最大张量是具有最高总和的权重集:

[[ 1, 2, 3], [0, 0, 2], [1, 0, 2]] would be [1, 2, 3]

1 个答案:

答案 0 :(得分:0)

我用map_fn想出来了:

我将张量重新设定为(-1,120,256)

tfr = tf.reshape(sometensor, ((-1, 120, 256)))
def func(slice):
    f1 = tf.reduce_sum(slice, axis=1)
    f2 = tf.argmax(f1)
    return(slice[f2])
bla = tf.map_fn(func, tfr)

使用greatested求和向量(最高权重集)返回(-1,256)。

基本上,map_fn将沿着第二个轴到最后一个轴进行迭代,因此它会重复地将一块(120,256)切片到func(第一个轴上有多少个条目)。然后它按块返回适当的(1,256)块,瞧,给出了答案。