簡體   English   中英

如何使用 TensorFlow 1.14 從 3D 張量中獲得最大二維張量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM