我发现无法在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]
答案 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)块,瞧,给出了答案。