code: def compute_intermediate_loss(self, outputs, outputs_target):
      assert len(outputs) == len(outputs_target)
      if self.int_metric_loss is not None:
          assert len(outputs) == len(self.int_weights)
          for i, w in enumerate(self.int_weights):
              xyz = self.input.pos
              xyz_target = self.input_target.pos
              loss_i = self.int_metric_loss(
                  outputs[i].x,
                  outputs_target[i].x,
                  self.match[:, :2],
                  xyz,
                  xyz_target,
              )
              self.loss += w * loss_i
              setattr(
                  self, "loss_intermediate_loss_{}".format(i), loss_i
              )
  
imports: import torch
  import torch.nn
  from torch.nn import LeakyReLU, Linear, Sequential
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn import voxel_grid
  from torch_geometric.data import Batch
  from torch_scatter import scatter_max, scatter_mean
  from torch_points3d.applications.sparseconv3d import SparseConv3d
  from torch_points3d.core.common_modules import FastBatchNorm1d, Seq
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.models.registration.base import FragmentBaseModel
label_desc: Use image node_id 2 for calling the MS_SparseConv3d_Shared obj's underlying member method code with example usage: obj.compute_intermediate_loss(outputs, outputs_target) without return types