code: def __init__(
      self,
      g,
      num_layers,
      in_dim,
      num_hidden,
      num_classes,
      heads,
      activation,
      feat_drop,
      attn_drop,
      alpha,
      residual,
  ):
      super(GAT, self).__init__()
      self.g = g
      self.num_layers = num_layers
      self.gat_layers = []
      self.activation = activation
      # input projection (no residual)
      self.gat_layers.append(
          GATConv(
              in_dim,
              num_hidden,
              heads[0],
              feat_drop,
              attn_drop,
              alpha,
              False,
          )
      )
      # hidden layers
      for l in range(1, num_layers):
          # due to multi-head, the in_dim = num_hidden * num_heads
          self.gat_layers.append(
              GATConv(
                  num_hidden * heads[l - 1],
                  num_hidden,
                  heads[l],
                  feat_drop,
                  attn_drop,
                  alpha,
                  residual,
              )
          )
      # output projection
      self.gat_layers.append(
          GATConv(
              num_hidden * heads[-2],
              num_classes,
              heads[-1],
              feat_drop,
              attn_drop,
              alpha,
              residual,
          )
      )
      for i, layer in enumerate(self.gat_layers):
          self.register_child(layer, "gat_layer_{}".format(i))
  
imports: import mxnet.gluon.nn
  from dgl.nn.mxnet.conv import GATConv
label_desc: Use image node_id 1 to create a new GAT object from inherited base classes: nn with example: obj = GAT(g, num_layers, in_dim, num_hidden, num_classes, heads, activation, feat_drop, attn_drop, alpha, residual)