class_docstr: siamese neural network using Kernel Point
  Convolution to learn descriptors on patch(for registration).
code: def forward(self, *args, **kwargs) -> Any:
      self.output = self.apply_nn(
          self.input, self.pre_computed, self.batch_idx
      )
      if self.labels is None:
          return self.output
      else:
          output_target = self.apply_nn(
              self.input_target,
              self.pre_computed_target,
              self.batch_idx_target,
          )
          self.output = torch.cat([self.output, output_target], 0)
          self.compute_loss()
          return self.output
  
imports: from typing import Any
  import torch
  import torch.nn.functional
  from torch.nn import Linear
  from torch.nn import Sequential
  from torch_geometric.data import Data
  from torch_geometric.nn import global_mean_pool
  import logging
  from torch_points3d.core.losses import *
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.core.common_modules import FastBatchNorm1d
  from torch_points3d.core.base_conv.partial_dense import *
  from torch_points3d.models.registration.base import FragmentBaseModel
  from torch_points3d.models.base_architectures import BackboneBasedModel
  from torch_points3d.models.registration.base import create_batch_siamese
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.models.base_architectures.unet import UnwrappedUnetBasedModel
  from torch_points3d.modules.KPConv import *
  from torch_points3d.datasets.registration.pair import PairMultiScaleBatch
label_desc: Use image node_id 5 for calling the PatchKPConv obj's underlying member method code with example usage: obj.forward() and returns: self, self