docstr: This method does a forward on the Unet assuming symmetrical skip connections
  Input --- D1 -- D2 -- I -- U1 -- U2 -- U3 -- output
     |       |      |________|      |    |
     |       |______________________|    |
     |___________________________________|
  
  Parameters:
  -----------
  data
      A dictionary that contains the data itself and its metadata information. Should contain
          x -- Features [B, N, C]
          pos -- Points [B, N, 3]
docstr_tok: ["This","method","does","a","forward","on","the","Unet","assuming","symmetrical","skip","connections","Input","--","-","D1","--","D2","--","I","--","U1","--","U2","--","U3","--","output","|","|","|________|","|","|","|","|______________________|","|","|___________________________________|","Parameters",":","--","--","--","--","--","-","data","A","dictionary","that","contains","the","data","itself","and","its","metadata","information",".","Should","contain","x","--","Features","[","B",",","N",",","C","]","pos","--","Points","[","B",",","N",",","3","]"]
code: def forward(self, data, *args, **kwargs):
      """This method does a forward on the Unet assuming symmetrical skip connections
      Input --- D1 -- D2 -- I -- U1 -- U2 -- U3 -- output
         |       |      |________|      |    |
         |       |______________________|    |
         |___________________________________|
  
      Parameters:
      -----------
      data
          A dictionary that contains the data itself and its metadata information. Should contain
              x -- Features [B, N, C]
              pos -- Points [B, N, 3]
      """
      self._set_input(data)
      data = self.input
      stack_down = [data]
      for i in range(len(self.down_modules) - 1):
          data = self.down_modules[i](data)
          stack_down.append(data)
      data = self.down_modules[-1](data)
  
      if not isinstance(self.inner_modules[0], Identity):
          stack_down.append(data)
          data = self.inner_modules[0](data)
  
      sampling_ids = self._collect_sampling_ids(stack_down)
  
      for i in range(len(self.up_modules)):
          data = self.up_modules[i]((data, stack_down.pop()))
  
      for key, value in sampling_ids.items():
          setattr(data, key, value)
  
      if self.has_mlp_head:
          data.x = self.mlp(data.x)
  
      return data
  
imports: import os
  import sys
  from omegaconf import DictConfig, OmegaConf
  import logging
  from torch_points3d.applications.modelfactory import ModelFactory
  from torch_points3d.modules.pointnet2 import *
  from torch_points3d.core.base_conv.dense import DenseFPModule
  from torch_points3d.models.base_architectures.unet import UnwrappedUnetBasedModel
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch
  from torch_points3d.core.common_modules.dense_modules import Conv1D
  from torch_points3d.core.common_modules.base_modules import Seq
  from .utils import extract_output_nc
label_desc: Use image node_id 1 for calling the PointNet2Unet obj's underlying member method code with example usage: obj.forward(data) and returns: data