[英]How to get the maximum 2D Tensor from a 3D tensor using TensorFlow 1.14?
我正在寻找基于使用 TensorFlow 1.14 的最大一个值从 3D 张量获取 2D 最大张量的最佳和优化方法(无循环)。 假设我们有这个张量和这个函数(为了理解-它不起作用-):
def get_Max(inputs):
max_indices = [0,0,0]
for i in range(16):
for j in range(2048):
for k in range(10):
if(inputs[max_indices[0],max_indices[1],max_indices[2]]<inputs[i,j,k]):
max_indices = [i,j,k]
return inputs[:][j]
inputs = tf.random.uniform(shape=[16,2048,10],dtype=tf.dtypes.float32)
output = get_Max(inputs)
因此,output 张量必须具有 [16,10] 的形状,这是 2048 的 16 个最大值。那么,如何实现一个 function 可以在没有循环的情况下做到这一点?
我使用tf.math.reduce_max
但这不是我想要的,因为它在下图中很清楚:
inp = tf.random.uniform(shape=[4, 6, 2], maxval=20, dtype=tf.int32)
print(inp)
array([[[14, 8],
[18, 10],
[ 6, 14],
[ 8, 9],
[11, 11],
[14, 13]],
[[ 7, 18],
[ 4, 10],
[15, 6],
[ 6, 2],
[19, 11],
[10, 4]],
[[ 8, 1],
[ 1, 3],
[ 4, 17],
[15, 7],
[ 0, 0],
[ 1, 4]],
[[ 5, 0],
[15, 12],
[ 1, 16],
[ 3, 17],
[14, 17],
[ 2, 18]]], dtype=int32)>
因此,如果我理解正确,对于每个inp[i, :, :]
就像:
[[14, 8],
[18, 10],
[ 6, 14],
[ 8, 9],
[11, 11],
[14, 13]]
您想保留包含最大数量的项目,在本例中为第二行: [18, 10]
。 我要做的是首先找到沿最后一个轴的最大数:
am = tf.math.reduce_max(inp, axis=2)
am[0, :, :]
[14,
18,
14,
9,
11,
14]
然后找到包含最大数的行的索引:
am = tf.math.argmax(am, axis=1)
这些将是您想要的j
,然后您可以使用tf.gather_nd
并枚举来获取这些值:
# [*enumerate(am)] = [(0, am[0]), (1, am[1]), ...]
tf.gather_nd(inp, [*enumerate(am)])
<tf.Tensor: shape=(4, 2), dtype=int32, numpy=
array([[18, 10],
[19, 11],
[ 4, 17],
[ 2, 18]], dtype=int32)>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.