class_docstr: Output:
      node representations
class_docstr_tok: ["Output",":","node","representations"]
code: def forward(self, g):
      x = g.node_feat["feat"]
      edge_feat = g.edge_feat["feat"]
  
      ### computing input node embedding
      h_list = [self.atom_encoder(x)]
      for layer in range(self.num_layers):
          h = self.convs[layer](g, h_list[layer], edge_feat)
          h = self.batch_norms[layer](h)
  
          if layer == self.num_layers - 1:
              # remove relu for the last layer
              h = F.dropout(h, self.drop_ratio, training=self.training)
          else:
              h = F.dropout(
                  F.relu(h), self.drop_ratio, training=self.training
              )
  
          if self.residual:
              h += h_list[layer]
  
          h_list.append(h)
  
      ### Different implementations of Jk-concat
      if self.JK == "last":
          node_representation = h_list[-1]
      elif self.JK == "sum":
          node_representation = 0
          for layer in range(self.num_layers):
              node_representation += h_list[layer]
  
      return node_representation
  
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 2 for calling the GNN_node obj's underlying member method code with example usage: obj.forward(g) and returns: node_representation