code: def __init__(self, inc, outc, ks=3, stride=1, dilation=1):
      super().__init__()
      self.net = nn.Sequential(
          spnn.Conv3d(
              inc,
              outc,
              kernel_size=ks,
              dilation=dilation,
              stride=stride,
          ),
          spnn.BatchNorm(outc),
          spnn.ReLU(True),
          spnn.Conv3d(
              outc, outc, kernel_size=ks, dilation=dilation, stride=1
          ),
          spnn.BatchNorm(outc),
      )
  
      self.downsample = (
          nn.Sequential()
          if (inc == outc and stride == 1)
          else nn.Sequential(
              spnn.Conv3d(
                  inc, outc, kernel_size=1, dilation=1, stride=stride
              ),
              spnn.BatchNorm(outc),
          )
      )
  
      self.relu = spnn.ReLU(True)
  
file_path: torch-points3d/torch_points3d/modules/PVCNN/blocks.py
imports: import torch.nn
  import torchsparse.nn
label_desc: Use image node_id 1 to create a new ResidualBlock object from inherited base classes: nn with example: obj = ResidualBlock(inc, outc, ks, stride, dilation)