code: def forward(self, *args, **kwargs):
      _, _, batch = self._argsparse(*args, **kwargs)
      # node embedding for GNN
      emb = self.get_emb(*args, **kwargs)
      # pooling process
      x = self.readout_layer(emb, batch)
  
      for i in range(self.num_mlp_layers - 1):
          x = self.mlps[i](x)
          x = self.fc_nonlinear(x)
          x = F.dropout(x, p=self.fc_dropout)
  
      logits = self.mlps[-1](x)
      return logits
  
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 4 for calling the GCNNet obj's underlying member method code with example usage: obj.forward() and returns: logits