code: def get_emb(self, *args, **kwargs):
      #  node embedding for GNN
      x, edge_index, _ = self._argsparse(*args, **kwargs)
      xs = []
      for i in range(self.num_gnn_layers):
          x = self.convs[i](x, edge_index)
          if self.gnn_emb_normalization:
              x = F.normalize(x, p=2, dim=-1)
          x = self.gnn_nonlinear(x)
          x = F.dropout(x, self.gnn_dropout)
          xs.append(x)
  
      if self.concate:
          return torch.cat(xs, dim=1)
      else:
          return x
  
imports: import torch
  import torch.nn
  from functools import partial
  from typing import Union, List
  import torch.nn.functional
  from torch_geometric.data import Batch
  from torch_geometric.nn.conv.gcn_conv import gcn_norm
  from torch_geometric.nn.conv import GCNConv
  from torch_geometric.nn.glob import global_mean_pool, global_add_pool, global_max_pool
  from torch import Tensor
  from torch_sparse import SparseTensor, fill_diag
  from torch_geometric.typing import Adj, OptTensor, Size
  from torch_geometric.utils import add_self_loops
  from dig.xgraph.models import GNNPool
  from collections import OrderedDict
label_desc: Use image node_id 3 for calling the GCNNet obj's underlying member method code with example usage: obj.get_emb() and returns: torch, x