code: def forward(self, data, **kwargs):
      batch_obj = Batch()
      x = data.x  # (N, indim)
      shortcut = x  # (N, indim)
      x = self.features_downsample_nn(x)  # (N, outdim//4)
      # if this is an identity resnet block, idx will be None
      data = self.convs(data)  # (N', convdim)
      x = data.x
      idx = data.idx
      x = self.features_upsample_nn(x)  # (N', outdim)
      if idx is not None:
          shortcut = shortcut[idx]  # (N', indim)
      shortcut = self.shortcut_feature_resize_nn(
          shortcut
      )  # (N', outdim)
      x = shortcut + x
      batch_obj.x = x
      batch_obj.pos = data.pos
      batch_obj.batch = data.batch
      copy_from_to(data, batch_obj)
      return batch_obj
  
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 3 for calling the BaseResnetBlock obj's underlying member method code with example usage: obj.forward(data) and returns: batch_obj