class_docstr: Encoder based on dgl.nn.GINConv &  dgl.nn.SumPooling
  Parameters
  -----------
  in_dim: int
      Input feature size.
  hid_dim: int
      Hidden feature size.
  n_layer:
      Number of GIN layers.
  
  Functions
  -----------
  forward(graph, feat):
      graph: DGLGraph
      feat: Tensor
          [N * D], node features
code: def forward(self, graph, feat):
      xs = []
      x = feat
      for i in range(self.n_layer):
          x = F.relu(self.convs[i](graph, x))
          x = self.bns[i](x)
          xs.append(x)
  
      local_emb = th.cat(xs, 1)  # patch-level embedding
      global_emb = self.pool(graph, local_emb)  # graph-level embedding
  
      return global_emb, local_emb
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from dgl.nn import GINConv, NNConv, Set2Set
  from dgl.nn.pytorch.glob import SumPooling
  from torch.nn import BatchNorm1d, GRU, Linear, ModuleList, ReLU, Sequential
  from utils import global_global_loss_, local_global_loss_
label_desc: Use image node_id 2 for calling the GINEncoder obj's underlying member method code with example usage: obj.forward(graph, feat) and returns: global_emb,  local_emb