topk

paddle.fluid.layers.nn. topk ( input, k, name=None ) [source]
Alias_main

paddle.topk :alias: paddle.topk,paddle.tensor.topk,paddle.tensor.search.topk :old_api: paddle.fluid.layers.topk

This OP is used to find values and indices of the k largest entries for the last dimension.

If the input is a 1-D Tensor, finds the k largest entries and outputs their values and indices.

If the input is a Tensor with higher rank, this operator computes the top k entries along the last dimension.

Case 1:

  Input:
    input.shape = [3, 4]
    input.data = [[5, 4, 2, 3],
             [9, 7, 10, 25],
             [6, 2, 10, 1]]
    k = 2

  Output:
    The first output:
    values.shape = [3, 2]
    values.data = [[5, 4],
              [10, 25],
              [6, 10]]

    The second output:
    indices.shape = [3, 2]
    indices.data = [[0, 1],
               [2, 3],
               [0, 2]]
Parameters
  • input (Variable) – The input tensor. Support data types: float32, float64.

  • k (int | Variable) – The number of top elements to look for along the last dimension of input tensor.

  • name (str, optional) – Please refer to Name, Default None.

Returns

Input tensor’s k largest elements along each last dimensional slice. The dimension is: \(input.shape[:-1]+[k]\). Indices (Variable): Indices of k largest elements alone the last dimension of input. The dimension is same as values.

Return type

Values (Variable)

Raises

ValueError – If \(k < 1\) or \(k > last dimension of input\).

Examples

import paddle.fluid as fluid
import paddle.fluid.layers as layers
# set batch size=None
input = fluid.data(name="input", shape=[None, 13, 11], dtype='float32')
top5_values, top5_indices = layers.topk(input, k=5) # top5_values.shape[None, 13, 5], top5_indices.shape=[None, 13, 5]

# 1D Tensor
input1 = fluid.data(name="input1", shape=[None, 13], dtype='float32')
top5_values, top5_indices = layers.topk(input1, k=5) #top5_values.shape=[None, 5], top5_indices.shape=[None, 5]

# k=Variable
input2 = fluid.data(name="input2", shape=[None, 13, 11], dtype='float32')
vk = fluid.data(name="vk", shape=[None, 1], dtype='int32') # save k in vk.data[0]
vk_values, vk_indices = layers.topk(input2, k=vk) #vk_values.shape=[None, 13, k], vk_indices.shape=[None, 13, k]