code: def __init__(
      self,
      num_features: int,
      num_classes: int,
      decimation: int = 4,
      num_neighbors: int = 16,
      return_logits: bool = False,
  ):
      super().__init__()
  
      self.decimation = decimation
      # An option to return logits instead of log probabilities:
      self.return_logits = return_logits
  
      # Authors use 8, which is a bottleneck
      # for the final MLP, and also when num_classes>8
      # or num_features>8.
      d_bottleneck = max(32, num_classes, num_features)
  
      self.fc0 = Linear(num_features, d_bottleneck)
      self.block1 = DilatedResidualBlock(
          num_neighbors, d_bottleneck, 32
      )
      self.block2 = DilatedResidualBlock(num_neighbors, 32, 128)
      self.block3 = DilatedResidualBlock(num_neighbors, 128, 256)
      self.block4 = DilatedResidualBlock(num_neighbors, 256, 512)
      self.mlp_summit = SharedMLP([512, 512])
      self.fp4 = FPModule(1, SharedMLP([512 + 256, 256]))
      self.fp3 = FPModule(1, SharedMLP([256 + 128, 128]))
      self.fp2 = FPModule(1, SharedMLP([128 + 32, 32]))
      self.fp1 = FPModule(1, SharedMLP([32 + 32, d_bottleneck]))
      self.mlp_classif = SharedMLP(
          [d_bottleneck, 64, 32], dropout=[0.0, 0.5]
      )
      self.fc_classif = Linear(32, num_classes)
  
imports: import os.path
  import torch
  import torch.nn.functional
  from randlanet_classification import DilatedResidualBlock, SharedMLP, decimate
  from torch.nn import Linear
  from torchmetrics.functional import jaccard_index
  from tqdm import tqdm
  import torch_geometric.transforms
  from torch_geometric.datasets import ShapeNet
  from torch_geometric.loader import DataLoader
  from torch_geometric.nn import knn_interpolate
  from torch_geometric.typing import WITH_TORCH_CLUSTER
  from torch_geometric.utils import scatter
label_desc: Use image node_id 1 to create a new Net object from inherited base classes: torch.nn with example: obj = Net(num_features, num_classes, decimation, num_neighbors, return_logits)