code: def top_k(x, reduced_dim, new_dim, dtype=tf.int32, name=None):
    
    reduced_dim = convert_to_dimension(reduced_dim)
    new_dim = convert_to_dimension(new_dim)
    indices = []
    values = []
    k = new_dim.size
    with tf.name_scope(name, default_name="top_k"):
      for i in xrange(k):
        max_index, max_val = top_1(x, reduced_dim, dtype)
        indices.append(max_index)
        values.append(max_val)
        if i + 1 < k:
          x += one_hot(max_index, reduced_dim, on_value=-1e9, dtype=x.dtype)
    axis = x.shape.dims.index(reduced_dim)
    return stack(indices, new_dim.name, axis), stack(values, new_dim.name, axis)
docs: Like tf.top_k.
  
    This operation returns two tensors with the same shape.  The output shape
    is identical to the shape of x, except that reduced_dim is replaced by
    new_dim.
  
    Args:
      x: a Tensor
      reduced_dim: a Dimension in x.shape.dims.
      new_dim: a Dimension.  The size determines k.
      dtype: optional dtype for indices.
      name: optional string.
    Returns:
      indices: a Tensor with given dtype.
      values: a Tensor with same type as x.