class_docstr: Applies `Layer Normalization <https://arxiv.org/abs/1607.06450>`_ over a 4D input tensor
  
  Args:
      num_features (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`
      eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5
      elementwise_affine (bool): If ``True``, use learnable affine parameters. Default: ``True``
  
  Shape:
      - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels,
      :math:`H` is the input height, and :math:`W` is the input width
      - Output: same shape as the input
code: def __init__(
      self,
      num_features: int,
      eps: Optional[float] = 1e-5,
      elementwise_affine: Optional[bool] = True,
      *args,
      **kwargs,
  ) -> None:
      super().__init__(
          num_channels=num_features,
          eps=eps,
          affine=elementwise_affine,
          num_groups=1,
      )
      self.num_channels = num_features
  
file_path: ml-cvnets/cvnets/layers/normalization/layer_norm.py
imports: from typing import List, Optional, Union
  import torch
  from torch import Size, Tensor, nn
  from cvnets.layers.normalization import register_norm_fn
label_desc: Use image node_id 1 to create a new LayerNorm2D_NCHW object from inherited base classes: nn with example: obj = LayerNorm2D_NCHW(num_features, eps, elementwise_affine)