class_docstr: Output:
      node representations
class_docstr_tok: ["Output",":","node","representations"]
docstr: emb_dim (int): node embedding dimensionality
  num_layer (int): number of GNN message passing layers
docstr_tok: ["emb_dim","(","int",")",":","node","embedding","dimensionality","num_layer","(","int",")",":","number","of","GNN","message","passing","layers"]
code: def __init__(
      self,
      num_layer,
      emb_dim,
      drop_ratio=0.5,
      JK="last",
      residual=False,
      gnn_type="gin",
  ):
      """
      emb_dim (int): node embedding dimensionality
      num_layer (int): number of GNN message passing layers
  
      """
  
      super(GNN_node, self).__init__()
      self.num_layer = num_layer
      self.drop_ratio = drop_ratio
      self.JK = JK
      ### add residual connection or not
      self.residual = residual
  
      if self.num_layer < 2:
          raise ValueError(
              "Number of GNN layers must be greater than 1."
          )
  
      self.atom_encoder = AtomEncoder(emb_dim)
  
      ###List of GNNs
      self.convs = torch.nn.ModuleList()
      self.batch_norms = torch.nn.ModuleList()
  
      for layer in range(num_layer):
          if gnn_type == "gin":
              self.convs.append(GINConv(emb_dim))
          elif gnn_type == "gcn":
              self.convs.append(GCNConv(emb_dim))
          else:
              raise ValueError(
                  "Undefined GNN type called {}".format(gnn_type)
              )
  
          self.batch_norms.append(torch.nn.BatchNorm1d(emb_dim))
  
imports: import torch
  from torch_geometric.nn import MessagePassing
  import torch.nn.functional
  from torch_geometric.nn import global_mean_pool, global_add_pool
  from ogb.graphproppred.mol_encoder import AtomEncoder, BondEncoder
  from torch_geometric.utils import degree
  import math
label_desc: Use image node_id 1 to create a new GNN_node object from inherited base classes: torch.nn with example: obj = GNN_node(num_layer, emb_dim, drop_ratio, JK, residual, gnn_type)