class_docstr: Description
  -----------
  Introduced in "DeeperGCN: All You Need to Train Deeper GCNs <https://arxiv.org/abs/2006.07739>"
  
  Parameters
  ----------
  node_feat_dim: int
      Size of node feature.
  edge_feat_dim: int
      Size of edge feature.
  hid_dim: int
      Size of hidden representations.
  out_dim: int
      Size of output.
  num_layers: int
      Number of graph convolutional layers.
  dropout: float
      Dropout rate. Default is 0.
  beta: float
      A continuous variable called an inverse temperature. Default is 1.0.
  learn_beta: bool
      Whether beta is a learnable weight. Default is False.
  aggr: str
      Type of aggregation. Default is 'softmax'.
  mlp_layers: int
      Number of MLP layers in message normalization. Default is 1.
code: def forward(self, g, edge_feats, node_feats=None):
      with g.local_scope():
          hv = self.node_encoder(node_feats)
          he = edge_feats
  
          for layer in range(self.num_layers):
              hv1 = self.norms[layer](hv)
              hv1 = F.relu(hv1)
              hv1 = F.dropout(
                  hv1, p=self.dropout, training=self.training
              )
              hv = self.gcns[layer](g, hv1, he) + hv
  
          h_g = self.pooling(g, hv)
  
          return self.output(h_g)
  
file_path: dgl/examples/pytorch/deepergcn/models.py
imports: import dgl.function
  import torch.nn
  import torch.nn.functional
  from dgl.nn.pytorch.glob import AvgPooling
  from layers import GENConv
  from ogb.graphproppred.mol_encoder import AtomEncoder
label_desc: Use image node_id 2 for calling the DeeperGCN obj's underlying member method code with example usage: obj.forward(g, edge_feats, node_feats) and returns: self