code: def forward(self, *args, **kwargs):
      features = self.backbone(self.input).x
      logits = self.head(features)
      self.output = F.log_softmax(logits, dim=-1)
      if self._weight_classes is not None:
          self._weight_classes = self._weight_classes.to(self.device)
      if self.labels is not None:
          self.loss_seg = F.nll_loss(
              self.output,
              self.labels,
              ignore_index=IGNORE_LABEL,
              weight=self._weight_classes,
          )
  
      self.data_visual = self.input
      self.data_visual.y = self.labels
      self.data_visual.pred = torch.max(self.output, -1)[1]
  
file_path: torch-points3d/torch_points3d/models/segmentation/sparseconv3d.py
imports: import logging
  import torch.nn.functional
  import torch.nn
  import torchsparse
  import torch
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
  from torch_points3d.applications.sparseconv3d import SparseConv3d
  import torch_points3d.modules.SparseConv3d
  from torch_points3d.core.common_modules import FastBatchNorm1d, Seq
label_desc: Use image node_id 3 for calling the APIModel obj's underlying member method code with example usage: obj.forward() without return types