class_docstr: Pixel shuffle decoder used to predict the line heatmap.
  
  Args:
      input_feat_dim: channel size of the input features.
      num_upsample: how many upsamples are performed.
      output_channel: number of output channels.
  Returns:
      the (B, 1, H, W) line heatmap.
class_docstr_tok: ["Pixel","shuffle","decoder","used","to","predict","the","line","heatmap",".","Args",":","input_feat_dim",":","channel","size","of","the","input","features",".","num_upsample",":","how","many","upsamples","are","performed",".","output_channel",":","number","of","output","channels",".","Returns",":","the","(","B",",","1",",","H",",","W",")","line","heatmap","."]
code: def forward(self, input_features: Tensor) -> Tensor:
      # Iterate til output block
      out = input_features
      for block in self.conv_block_lst[:-1]:
          out = block(out)
          out = self.pixshuffle(out)
  
      # Output layer
      out = self.conv_block_lst[-1](out)
      heatmap = softmax(out, dim=1)[:, 1, :, :]
  
      return heatmap
  
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 3 for calling the PixelShuffleDecoder obj's underlying member method code with example usage: obj.forward(input_features) and returns: heatmap