code: def __init__(
      self,
      in_feats,
      n_classes,
      n_hidden,
      n_layers,
      n_heads,
      activation,
      dropout=0.0,
      input_drop=0.0,
      attn_drop=0.0,
      edge_drop=0.0,
      use_attn_dst=True,
      use_symmetric_norm=False,
  ):
      super().__init__()
      self.in_feats = in_feats
      self.n_hidden = n_hidden
      self.n_classes = n_classes
      self.n_layers = n_layers
      self.num_heads = n_heads
  
      self.convs = nn.ModuleList()
      self.norms = nn.ModuleList()
  
      for i in range(n_layers):
          in_hidden = n_heads * n_hidden if i > 0 else in_feats
          out_hidden = n_hidden if i < n_layers - 1 else n_classes
          num_heads = n_heads if i < n_layers - 1 else 1
          out_channels = n_heads
  
          self.convs.append(
              GATConv(
                  in_hidden,
                  out_hidden,
                  num_heads=num_heads,
                  attn_drop=attn_drop,
                  edge_drop=edge_drop,
                  use_attn_dst=use_attn_dst,
                  use_symmetric_norm=use_symmetric_norm,
                  residual=True,
              )
          )
  
          if i < n_layers - 1:
              self.norms.append(
                  nn.BatchNorm1d(out_channels * out_hidden)
              )
  
      self.bias_last = ElementWiseLinear(
          n_classes, weight=False, bias=True, inplace=True
      )
  
      self.input_drop = nn.Dropout(input_drop)
      self.dropout = nn.Dropout(dropout)
      self.activation = activation
  
imports: import dgl.nn.pytorch
  import torch
  import torch.nn
  from dgl import function
  from dgl.ops import edge_softmax
  from dgl.utils import expand_as_pair
label_desc: Use image node_id 1 to create a new GAT object from inherited base classes: nn with example: obj = GAT(in_feats, n_classes, n_hidden, n_layers, n_heads, activation, dropout, input_drop, attn_drop, edge_drop, use_attn_dst, use_symmetric_norm)