class_docstr: ## ResNet Block
docstr: :param in_channels: is the number of channels in the input
  :param out_channels: is the number of channels in the output
code: def __init__(self, in_channels: int, out_channels: int):
      """
      :param in_channels: is the number of channels in the input
      :param out_channels: is the number of channels in the output
      """
      super().__init__()
      # First normalization and convolution layer
      self.norm1 = normalization(in_channels)
      self.conv1 = nn.Conv2d(
          in_channels, out_channels, 3, stride=1, padding=1
      )
      # Second normalization and convolution layer
      self.norm2 = normalization(out_channels)
      self.conv2 = nn.Conv2d(
          out_channels, out_channels, 3, stride=1, padding=1
      )
      # `in_channels` to `out_channels` mapping layer for residual connection
      if in_channels != out_channels:
          self.nin_shortcut = nn.Conv2d(
              in_channels, out_channels, 1, stride=1, padding=0
          )
      else:
          self.nin_shortcut = nn.Identity()
  
imports: from typing import List
  import torch
  import torch.nn.functional
  from torch import nn
label_desc: Use image node_id 1 to create a new ResnetBlock object from inherited base classes: nn with example: obj = ResnetBlock(in_channels, out_channels)