class_docstr: Junction decoder based on the SuperPoint architecture.
  
  Args:
      input_feat_dim: channel size of the input features.
  Returns:
      the junction heatmap, with shape (B, H, W).
class_docstr_tok: ["Junction","decoder","based","on","the","SuperPoint","architecture",".","Args",":","input_feat_dim",":","channel","size","of","the","input","features",".","Returns",":","the","junction","heatmap",",","with","shape","(","B",",","H",",","W",")","."]
code: def __init__(
      self, input_feat_dim: int = 128, grid_size: int = 8
  ) -> None:
      super().__init__()
      self.relu = nn.ReLU(inplace=True)
      # Perform strided convolution when using lcnn backbone.
      self.convPa = nn.Conv2d(
          input_feat_dim, 256, kernel_size=3, stride=2, padding=1
      )
      self.convPb = nn.Conv2d(
          256, 65, kernel_size=1, stride=1, padding=0
      )
      self.grid_size = grid_size
  
imports: from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union
  import torch
  import torch.nn.functional
  from torch import nn
  from torch.nn.functional import pixel_shuffle, softmax
  from kornia.core import Module, Tensor
label_desc: Use image node_id 1 to create a new SuperpointDecoder object from inherited base classes: Module with example: obj = SuperpointDecoder(input_feat_dim, grid_size)