TopK

バージョン名: TopK-11

カテゴリー: ソートと最大化

簡単な説明: TopK は、指定された軸に沿った各スライスの k 個の最大/最小値のインデックスと値を計算します。

属性:

  • axis

    • 説明: 値を取得する軸を指定します。

    • 値の範囲: 整数。負の値は、次元を後ろから数えることを意味します。

    • タイプ: int

    • 必須: はい

  • mode

    • 説明: TopK が各スライスから最大の要素を選択するか最小の要素を選択するかを指定します。

    • 値の範囲: “min”、“max”

    • タイプ: string

    • 必須: はい

  • sort

    • 説明: 出力テンソルの対応する要素の順序を指定します。

    • 値の範囲: valueindexnone

    • タイプ: string

    • 必須: はい

  • stable

    • 説明: 同等の要素が入力テンソルからの相対的な順序を維持するかどうかを指定します。sort 属性が value または index に設定されている場合にのみ有効です。

    • 値の範囲: true または false

    • タイプ: boolean

    • デフォルト値 : false

    • 必須: いいえ

  • index_element_type

    • 説明: インデックス付きの出力テンソルのタイプ

    • 値の範囲: “i64” または “i32”

    • タイプ: 文字列

    • デフォルト値: “i32”

    • 必須: いいえ

入力:

  • 1: 任意のランクとタイプ T のテンソル。必須。

  • 2: K の値 - 入力テンソルから選択する要素の数を指定する任意の整数タイプのスカラー。K の値の許容範囲は <1;input1.shape[axis]> です。K の値がこれらの要件を満たさない場合、このオペレーターの動作は未定義です。必須。

出力:

  • 1: 指定されたに沿った入力テンソルからの k 値を持つタイプ T の出力テンソル。テンソルの形状は、[input1.shape[0], ..., input1.shape[axis-1], 1..k, input1.shape[axis+1], ..., input1.shape[input1.rank - 1]] です。

  • 2: 最初の出力テンソルからの対応する要素 (値) のインデックスを含む出力テンソル。インデックスは、元の入力テンソル内の選択された値の位置を指します。この出力テンソルの形状は、最初の出力の形状と同じです。つまり、[input1.shape[0], ..., input1.shape[axis-1], 1..k, input1.shape[axis+1], ..., input1.shape[input1.rank - 1]] です。このテンソル T_IND のタイプは、index_element_type 属性によって制御されます。

タイプ:

  • T: 任意の数値タイプ。

  • T_IND: int64 または int32

詳細説明:

出力テンソルには、次の方法で計算された値が入力されます。

output[i1, ..., i(axis-1), j, i(axis+1) ..., iN] = top_k(input[i1, ...., i(axis-1), :, i(axis+1), ..., iN]), k, sort, mode)

スライス input[i1, ...., i(axis-1), :, i(axis+1), ..., iN] ごとに、TopK 値が個別に計算されます。

並べ替えと最小/最大は、stable によって提供される追加の構成機能を備えた sort 属性と mode 属性によって制御されます。

  • sort = valuemode = max , stable = false - 値による降順、等しい要素の相対順序が維持されることは保証されません

  • sort = valuemode = max , stable = true - 値による降順、等しい要素の相対順序が維持されることは保証されます

  • sort = valuemode = min , stable = false - 値による昇順、等しい要素の相対順序が維持されることは保証されません

  • sort = valuemode = min , stable = true - 値による昇順、等しい要素の相対順序が維持されることは保証されます

  • sort = indexmode = max , stable = false - インデックスによる昇順、等しい要素の相対順序が維持されることは保証されません

  • sort = indexmode = max , stable = true - インデックスによる昇順、等しい要素の相対順序が維持されることは保証されます

  • sort = indexmode = min , stable = false - インデックスによる昇順、等しい要素の相対順序が維持されることは保証されません

  • sort = indexmode = min , stable = true - インデックスによる昇順、等しい要素の相対順序が維持されることは保証されます

  • sort = nonemode = max - 未定義

  • sort = nonemode = min - 未定義

同等の要素の相対的な順序は、stable 属性が true に設定されている場合にのみ保持されます。これにより、実装では TopK 要素の計算中に安定したソート・アルゴリズムが使用されます。それ以外は出力順序は未定義です。“インデックスによる” 順序は、入力テンソルの要素は値によってソートされますが、出力テンソル内の要素の順序は入力テンソル内の要素のインデックスによって決定されることを意味します。ただし、これにより複数の正しい結果が得られる可能性があります。例えば、入力テンソルに次の要素が含まれているとします。

input = [5, 3, 1, 2, 5, 5]

および TopK が次のように設定されている場合:

mode = min
sort = index
k = 4

その場合、次の 3 つの結果は正しくなります。

output_values  = [5, 3, 1, 2]
output_indices = [0, 1, 2, 3]

output_values  = [3, 1, 2, 5]
output_indices = [1, 2, 3, 4]

output_values  = [3, 1, 2, 5]
output_indices = [1, 2, 3, 5]

さらに、stable 属性が true に設定されている場合、上記の例の正しい解決策は 1 つだけです。

output_values  = [5, 3, 1, 2]
output_indices = [0, 1, 2, 3]

特定の TopK ノードに対して sort == index を指定すると、インデックスは常に昇順にソートされます。sort == index および mode == max を設定すると、値は最初に降順で並べ替えられますが、出力要素の順序に影響するインデックスは昇順で並べ替えられます。

例:

この例では、K が 10 に等しいと想定します。

<layer ... type="TopK" ... >
    <data axis="3" mode="max" sort="value" stable="true" index_element_type="i64"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>3</dim>
            <dim>224</dim>
            <dim>224</dim>
        </port>
        <port id="1">
        </port>
    <output>
        <port id="2">
            <dim>1</dim>
            <dim>3</dim>
            <dim>224</dim>
            <dim>10</dim>
        </port>
        <port id="3">
            <dim>1</dim>
            <dim>3</dim>
            <dim>224</dim>
            <dim>10</dim>
        </port>
    </output>
</layer>