code: def point_sample(input, points, align_corners=False, **kwargs):
      """A wrapper around :func:`grid_sample` to support 3D point_coords tensors
      Unlike :func:`torch.nn.functional.grid_sample` it assumes point_coords to
      lie inside ``[0, 1] x [0, 1]`` square.
      Args:
          input (Tensor): Feature map, shape (N, C, H, W).
          points (Tensor): Image based absolute point coordinates (normalized),
              range [0, 1] x [0, 1], shape (N, P, 2) or (N, Hgrid, Wgrid, 2).
          align_corners (bool): Whether align_corners. Default: False
      Returns:
          Tensor: Features of `point` on `input`, shape (N, C, P) or
              (N, C, Hgrid, Wgrid).
      """
  
      def denormalize(grid):
          """Denormalize input grid from range [0, 1] to [-1, 1]
          Args:
              grid (Tensor): The grid to be denormalize, range [0, 1].
          Returns:
              Tensor: Denormalized grid, range [-1, 1].
          """
  
          return grid * 2.0 - 1.0
  
      add_dim = False
      if points.dim() == 3:
          add_dim = True
          points = paddle.unsqueeze(points, axis=2)  # [2, 2048, 1, 2]
      output = F.grid_sample(
          input,
          denormalize(points),
          align_corners=align_corners,
          **kwargs,
      )
      if add_dim:
          output = paddle.squeeze(output, axis=3)
      return output
  
file_path: PaddleSeg/paddleseg/models/losses/point_cross_entropy_loss.py
imports: import paddle
  from paddle import nn
  import paddle.nn.functional
  from paddleseg.cvlibs import manager
label_desc: Use image node_id 1 for calling a global function with example usage: point_sample(input, points, align_corners) and returns: output, unknown