class_docstr: Bottleneck block with residual
class_docstr_tok: ["Bottleneck","block","with","residual"]
code: def __init__(self, input_nc, output_nc, convolution, reduction=4):
      super().__init__()
  
      self.block = (
          Seq()
          .append(
              snn.Conv3d(
                  input_nc,
                  output_nc // reduction,
                  kernel_size=1,
                  stride=1,
              )
          )
          .append(snn.BatchNorm(output_nc // reduction))
          .append(snn.ReLU())
          .append(
              convolution(
                  output_nc // reduction,
                  output_nc // reduction,
                  kernel_size=3,
                  stride=1,
              )
          )
          .append(snn.BatchNorm(output_nc // reduction))
          .append(snn.ReLU())
          .append(
              snn.Conv3d(
                  output_nc // reduction,
                  output_nc,
                  kernel_size=1,
              )
          )
          .append(snn.BatchNorm(output_nc))
          .append(snn.ReLU())
      )
  
      if input_nc != output_nc:
          self.downsample = (
              Seq()
              .append(
                  convolution(
                      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 BottleneckBlock object from inherited base classes: torch.nn with example: obj = BottleneckBlock(input_nc, output_nc, convolution, reduction)