code: def forward(self, x):
      batch_size = x.shape[0]
      h = x.permute(0, 2, 1)
      if self.use_transform:
          trans = self.transform1(h)
          h = h.transpose(2, 1)
          h = torch.bmm(h, trans)
          h = h.transpose(2, 1)
          h = F.relu(self.trans_bn1(h))
  
      for conv, bn in zip(self.conv1, self.bn1):
          h = conv(h)
          h = bn(h)
          h = F.relu(h)
  
      if self.use_transform:
          trans = self.transform2(h)
          h = h.transpose(2, 1)
          h = torch.bmm(h, trans)
          h = h.transpose(2, 1)
          h = F.relu(self.trans_bn2(h))
  
      for conv, bn in zip(self.conv2, self.bn2):
          h = conv(h)
          h = bn(h)
          h = F.relu(h)
  
      h = self.maxpool(h).view(-1, self.pool_feat_len)
      for mlp, bn in zip(self.mlp3, self.bn3):
          h = mlp(h)
          h = bn(h)
          h = F.relu(h)
  
      h = self.dropout(h)
      out = self.mlp_out(h)
      return out
  
file_path: dgl/examples/pytorch/pointcloud/pointnet/pointnet_cls.py
imports: import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from torch.autograd import Variable
label_desc: Use image node_id 2 for calling the PointNetCls obj's underlying member method code with example usage: obj.forward(x) and returns: out