class_docstr: Simple graph attention layer.
  
  :param in_features: The number of input features.
  :param out_features: The number of output features.
  :param alpha: Specify the negative slope of the leakyReLU.
  :param dropout: Specify the dropout to be applied.
class_docstr_tok: ["Simple","graph","attention","layer",".",":","param","in_features",":","The","number","of","input","features",".",":","param","out_features",":","The","number","of","output","features",".",":","param","alpha",":","Specify","the","negative","slope","of","the","leakyReLU",".",":","param","dropout",":","Specify","the","dropout","to","be","applied","."]
code: def __init__(
      self,
      in_features: int,
      out_features: int,
      alpha: float,
      dropout: float,
  ):
      super().__init__()
      self.in_features = in_features
      self.out_features = out_features
  
      self.alpha = alpha
      self.dropout = dropout
  
      self.weight = nn.Parameter(
          torch.empty(
              size=(in_features, out_features), dtype=torch.float32
          )
      )
      self.weight_a1 = nn.Parameter(
          torch.empty(size=(out_features, 1), dtype=torch.float32)
      )
      self.weight_a2 = nn.Parameter(
          torch.empty(size=(out_features, 1), dtype=torch.float32)
      )
  
      self.leakyrelu = nn.LeakyReLU(self.alpha)
  
imports: from collections import OrderedDict
  from typing import Union, List, Sequence, Dict
  import numpy
  import torch
  import torch.nn.functional
  from torch import nn
  from maze.core.annotations import override
  from maze.core.utils.factory import Factory
  from maze.perception.blocks.feed_forward.graph_conv import GraphAdjacencyMethods
  from maze.perception.blocks.shape_normalization import ShapeNormalizationBlock
label_desc: Use image node_id 1 to create a new GraphAttentionLayer object from inherited base classes: nn with example: obj = GraphAttentionLayer(in_features, out_features, alpha, dropout)