code: def __init__(self, sampler, neighbour_finder, *args, **kwargs):
      super(BaseResnetBlockDown, self).__init__(
          sampler, neighbour_finder, *args, **kwargs
      )
  
      in_features, out_features, conv_features = kwargs.get(
          "down_conv_nn", None
      )
  
      self.in_features = in_features
      self.out_features = out_features
      self.conv_features = conv_features
  
      self.features_downsample_nn = MLP(
          [self.in_features, self.conv_features]
      )
  
      self.features_upsample_nn = MLP(
          [self.conv_features, self.out_features]
      )
      self.shortcut_feature_resize_nn = MLP(
          [self.in_features, self.out_features]
      )
  
imports: from abc import abstractmethod
  from typing import *
  import torch
  from torch.nn import Linear, ReLU, LeakyReLU, BatchNorm1d, Dropout
  from torch_geometric.nn import knn_interpolate, fps, radius, global_max_pool, global_mean_pool, knn
  from torch_geometric.data import Batch
  from torch_points3d.core.base_conv.base_conv import *
  from torch_points3d.core.common_modules import *
  from torch_points3d.core.spatial_ops import *
label_desc: Use image node_id 1 to create a new BaseResnetBlockDown object from inherited base classes: BaseConvolutionDown with example: obj = BaseResnetBlockDown(sampler, neighbour_finder)