code: def forward(self, x):
      hs = []
      batch_size, n_points, x_dims = x.shape
      h = x
  
      for i in range(self.num_layers):
          g = self.nng(h).to(h.device)
          h = h.view(batch_size * n_points, -1)
          h = self.conv[i](g, h)
          h = F.leaky_relu(h, 0.2)
          h = h.view(batch_size, n_points, -1)
          hs.append(h)
  
      h = torch.cat(hs, 2)
      h = self.proj(h)
      h_max, _ = torch.max(h, 1)
      h_avg = torch.mean(h, 1)
      h = torch.cat([h_max, h_avg], 1)
  
      for i in range(self.num_embs):
          h = self.embs[i](h)
          h = self.bn_embs[i](h)
          h = F.leaky_relu(h, 0.2)
          h = self.dropouts[i](h)
  
      h = self.proj_output(h)
      return h
  
file_path: dgl/examples/pytorch/pointcloud/edgeconv/model.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  from dgl.nn.pytorch import EdgeConv, KNNGraph
label_desc: Use image node_id 2 for calling the Model obj's underlying member method code with example usage: obj.forward(x) and returns: h