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