class_docstr: P = ((S-1)*W-S+F)/2, with F = filter size, S = stride
code: def __init__(
      self,
      in_channels,
      out_channels,
      bias=False,
      kernel_size=1,
      stride=1,
      padding=0,
      dilation=1,
      activation=None,
      batch_norm=None,
  ):
      super(Conv2D, self).__init__()
  
      self.activation = activation
      self.norm = batch_norm
  
      self.conv = nn.Conv2d(
          in_channels=in_channels,
          out_channels=out_channels,
          bias=bias,
          kernel_size=kernel_size,
          stride=stride,
          padding=padding,
          dilation=dilation,
      )
  
      if self.norm is not None:
          self.norm = nn.BatchNorm2d
  
      if self.activation is not None:
          if self.activation == "relu":
              self.activation = nn.ReLU()
          else:
              raise Exception(
                  f"activation {self.activation} not supported"
              )
  
file_path: ARKitScenes/depth_upsampling/models/mspf/blocks/multi_scale_depth.py
imports: import torch.nn.functional
  from torch import nn
label_desc: Use image node_id 1 to create a new Conv2D object from inherited base classes: nn with example: obj = Conv2D(in_channels, out_channels, bias, kernel_size, stride, padding, dilation, activation, batch_norm)