class_docstr: Basic ResNet type block
  
  Parameters
  ----------
  input_nc:
      Number of input channels
  output_nc:
      number of output channels
  convolution
      Either MinkowskConvolution or MinkowskiConvolutionTranspose
  dimension:
      Dimension of the spatial grid
class_docstr_tok: ["Basic","ResNet","type","block","Parameters","--","--","--","--","--","input_nc",":","Number","of","input","channels","output_nc",":","number","of","output","channels","convolution","Either","MinkowskConvolution","or","MinkowskiConvolutionTranspose","dimension",":","Dimension","of","the","spatial","grid"]
code: def __init__(self, input_nc, output_nc, convolution):
      super().__init__()
      self.block = (
          Seq()
          .append(
              convolution(input_nc, output_nc, kernel_size=3, stride=1)
          )
          .append(snn.BatchNorm(output_nc))
          .append(snn.ReLU())
          .append(
              convolution(output_nc, output_nc, kernel_size=3, stride=1)
          )
          .append(snn.BatchNorm(output_nc))
          .append(snn.ReLU())
      )
  
      if input_nc != output_nc:
          self.downsample = (
              Seq()
              .append(
                  snn.Conv3d(
                      input_nc, output_nc, kernel_size=1, stride=1
                  )
              )
              .append(snn.BatchNorm(output_nc))
          )
      else:
          self.downsample = None
  
file_path: torch-points3d/torch_points3d/modules/SparseConv3d/modules.py
imports: import torch
  import sys
  from torch_points3d.core.common_modules import Seq, Identity
  import torch_points3d.modules.SparseConv3d.nn
label_desc: Use image node_id 1 to create a new ResBlock object from inherited base classes: torch.nn with example: obj = ResBlock(input_nc, output_nc, convolution)