class_docstr: Perception block normalizing the input and de-normalizing the output tensor dimensions.
  
  Examples where this interface needs to be implemented are Dense Layers (batch-dim, feature-dim)
  or Convolution Blocks (batch-dim, feature-dim, row-dim, column-dim)
  
  :param in_keys: Keys identifying the input tensors.
  :param out_keys: Keys identifying the output tensors.
  :param in_shapes: List of input shapes.
  :param in_num_dims: Required number of dimensions for corresponding input.
  :param out_num_dims: Required number of dimensions for corresponding output.
class_docstr_tok: ["Perception","block","normalizing","the","input","and","de-normalizing","the","output","tensor","dimensions",".","Examples","where","this","interface","needs","to","be","implemented","are","Dense","Layers","(","batch-dim",",","feature-dim",")","or","Convolution","Blocks","(","batch-dim",",","feature-dim",",","row-dim",",","column-dim",")",":","param","in_keys",":","Keys","identifying","the","input","tensors",".",":","param","out_keys",":","Keys","identifying","the","output","tensors",".",":","param","in_shapes",":","List","of","input","shapes",".",":","param","in_num_dims",":","Required","number","of","dimensions","for","corresponding","input",".",":","param","out_num_dims",":","Required","number","of","dimensions","for","corresponding","output","."]
code: def __init__(
      self,
      in_keys: Union[str, List[str]],
      out_keys: Union[str, List[str]],
      in_shapes: Union[Sequence[int], List[Sequence[int]]],
      in_num_dims: Union[int, List[int]],
      out_num_dims: Union[int, List[int]],
  ):
      super().__init__(
          in_keys=in_keys, out_keys=out_keys, in_shapes=in_shapes
      )
      self.in_num_dims: List[int] = (
          in_num_dims
          if isinstance(in_num_dims, List)
          else [in_num_dims]
      )
      self.out_num_dims: List[int] = (
          out_num_dims
          if isinstance(out_num_dims, List)
          else [out_num_dims]
      )
  
file_path: maze/maze/perception/blocks/shape_normalization.py
imports: from abc import ABC, abstractmethod
  from typing import Dict, Union, List, Tuple, Sequence
  import numpy
  import torch
  from maze.core.annotations import override
  from maze.perception.blocks.base import PerceptionBlock
label_desc: Use image node_id 1 to create a new ShapeNormalizationBlock object from inherited base classes: PerceptionBlock, ABC with example: obj = ShapeNormalizationBlock(in_keys, out_keys, in_shapes, in_num_dims, out_num_dims)