TopK#
Domain:
ai.onnxSince version: 11
Retrieve the top-K largest or smallest elements along a specified axis. Given an input tensor of shape [a_0, a_1, …, a{n-1}] and integer argument k, return two outputs:
Value tensor of shape [a_0, a_1, …, a{axis-1}, k, a{axis+1}, … a{n-1}] which contains the values of the top k elements along the specified axis
Index tensor of shape [a_0, a_1, …, a{axis-1}, k, a{axis+1}, … a{n-1}] which contains the indices of the top k elements (original indices from the input tensor).
If “largest” is 1 (the default) then the k largest elements are returned.
If “sorted” is 1 (the default) then the resulting k elements will be sorted.
If “sorted” is 0, order of returned ‘Values’ and ‘Indices’ are undefined.
Given two equivalent values, this operator uses the indices along the axis as a tiebreaker. That is, the element with the lower index will appear first.
Inputs
X (T): Tensor of shape [a_0, a_1, …, a{n-1}]
K (tensor(int64)): A 1-D tensor containing a single positive value corresponding to the number of top elements to retrieve
Outputs
Values (T): Tensor of shape [a_0, a_1, …, a{axis-1}, k, a{axis+1}, … a{n-1}] containing top K values from the input tensor
Indices (I): Tensor of shape [a_0, a_1, …, a{axis-1}, k, a{axis+1}, … a{n-1}] containing the corresponding input tensor indices for the top K values.
Attributes
axis (int): Dimension on which to do the sort. Negative value means counting dimensions from the back. Accepted range is [-r, r-1] where r = rank(input).
largest (int): Whether to return the top-K largest or smallest elements.
sorted (int): Whether to return the elements in sorted order.
Type Constraints
T: Constrain input and output types to numeric tensors. Allowed types: tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8).
I: Constrain index tensor to int64 Allowed types: tensor(int64).
Examples#
test_cc_top_k
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
Inputs:
x: shape=(3, 4), dtype=float32
[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3, 3), dtype=float32
[[ 3., 2., 1.],
[ 7., 6., 5.],
[11., 10., 9.]]
indices: shape=(3, 3), dtype=int64
[[3, 2, 1],
[3, 2, 1],
[3, 2, 1]]
test_cc_top_k_neg_inf
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
largest = 0
sorted = 1
Inputs:
x: shape=(1, 5), dtype=float32
[[ 1., -inf, -3., -inf, 2.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(1, 3), dtype=float32
[[-inf, -inf, -3.]]
indices: shape=(1, 3), dtype=int64
[[1, 3, 2]]
test_cc_top_k_negative_axis
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = -1
Inputs:
x: shape=(3, 4), dtype=float32
[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3, 3), dtype=float32
[[ 3., 2., 1.],
[ 7., 6., 5.],
[11., 10., 9.]]
indices: shape=(3, 3), dtype=int64
[[3, 2, 1],
[3, 2, 1],
[3, 2, 1]]
test_cc_top_k_pos_inf
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
largest = 1
sorted = 1
Inputs:
x: shape=(1, 5), dtype=float32
[[ 1., inf, 3., inf, 2.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(1, 3), dtype=float32
[[inf, inf, 3.]]
indices: shape=(1, 3), dtype=int64
[[1, 3, 2]]
test_cc_top_k_pos_neg_inf
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 0
largest = 1
sorted = 1
Inputs:
x: shape=(5,), dtype=float32
[ inf, -1., -inf, 2., 0.]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3,), dtype=float32
[inf, 2., 0.]
indices: shape=(3,), dtype=int64
[0, 3, 4]
test_cc_top_k_same_values
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 0
Inputs:
x: shape=(5,), dtype=float32
[1., 2., 3., 3., 2.]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3,), dtype=float32
[3., 3., 2.]
indices: shape=(3,), dtype=int64
[2, 3, 1]
test_cc_top_k_same_values_2d
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
Inputs:
x: shape=(2, 4), dtype=float32
[[1., 2., 2., 3.],
[5., 5., 4., 3.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(2, 3), dtype=float32
[[3., 2., 2.],
[5., 5., 4.]]
indices: shape=(2, 3), dtype=int64
[[3, 1, 2],
[0, 1, 2]]
test_cc_top_k_same_values_largest
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 0
largest = 1
sorted = 1
Inputs:
x: shape=(5,), dtype=float32
[1., 2., 3., 3., 2.]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3,), dtype=float32
[3., 3., 2.]
indices: shape=(3,), dtype=int64
[2, 3, 1]
test_cc_top_k_smallest
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
largest = 0
sorted = 1
Inputs:
x: shape=(3, 4), dtype=float32
[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[11., 10., 9., 8.]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3, 3), dtype=float32
[[ 0., 1., 2.],
[ 4., 5., 6.],
[ 8., 9., 10.]]
indices: shape=(3, 3), dtype=int64
[[0, 1, 2],
[0, 1, 2],
[3, 2, 1]]
test_cc_top_k_uint64
Node:
TopK(x, k) -> (values, indices)
Attributes:
axis = 1
Inputs:
x: shape=(3, 4), dtype=uint64
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
k: shape=(1,), dtype=int64
[3]
Outputs:
values: shape=(3, 3), dtype=uint64
[[ 3, 2, 1],
[ 7, 6, 5],
[11, 10, 9]]
indices: shape=(3, 3), dtype=int64
[[3, 2, 1],
[3, 2, 1],
[3, 2, 1]]
Differences with previous version (10)#
SchemaDiff: TopK (domain 'ai.onnx')
old version: 10
new version: 11
breaking: no
Attributes:
added ‘largest’: type=INT; required=False; default=1
added ‘sorted’: type=INT; required=False; default=1
Type constraints:
changed ‘T’: added types: [‘tensor(int16)’, ‘tensor(int32)’, ‘tensor(int64)’, ‘tensor(int8)’, ‘tensor(uint16)’, ‘tensor(uint32)’, ‘tensor(uint64)’, ‘tensor(uint8)’]
Documentation:
line similarity: 0.22 (+13/-8 lines)
--- TopK v10
+++ TopK v11
@@ -1,11 +1,16 @@
-Retrieve the top-K elements along a specified axis. Given an input tensor of
+Retrieve the top-K largest or smallest elements along a specified axis. Given an input tensor of
shape [a_0, a_1, ..., a_{n-1}] and integer argument k, return two outputs:
- -Value tensor of shape [a_0, a_1, ..., a_{axis-1}, k, a_{axis+1}, ... a_{n-1}]
- which contains the values of the top k elements along the specified axis
- -Index tensor of shape [a_0, a_1, ..., a_{axis-1}, k, a_{axis+1}, ... a_{n-1}] which
- contains the indices of the top k elements (original indices from the input
- tensor).
-Given two equivalent values, this operator uses the indices along the axis as
- a tiebreaker. That is, the element with the lower index will appear first.
+* Value tensor of shape [a_0, a_1, ..., a_{axis-1}, k, a_{axis+1}, ... a_{n-1}]
+ which contains the values of the top k elements along the specified axis
+* Index tensor of shape [a_0, a_1, ..., a_{axis-1}, k, a_{axis+1}, ... a_{n-1}] which
+ contains the indices of the top k elements (original indices from the input
+ tensor).
+
+* If "largest" is 1 (the default) then the k largest elements are returned.
+* If "sorted" is 1 (the default) then the resulting k elements will be sorted.
+* If "sorted" is 0, order of returned 'Values' and 'Indices' are undefined.
+
+Given two equivalent values, this operator uses the indices along the axis as
+a tiebreaker. That is, the element with the lower index will appear first.