class_docstr: General GNN layer, with add attention
class_docstr_tok: ["General","GNN","layer",",","with","add","attention"]
code: def __init__(
      self,
      in_channels,
      out_channels,
      improved=False,
      cached=False,
      bias=True,
      **kwargs,
  ):
      super(GeneralAddAttConvLayer, self).__init__(
          aggr=cfg.gnn.agg, **kwargs
      )
  
      self.heads = cfg.gnn.att_heads
      self.in_channels = int(in_channels // self.heads * self.heads)
      self.out_channels = int(out_channels // self.heads * self.heads)
      self.improved = improved
      self.cached = cached
      self.normalize = cfg.gnn.normalize_adj
      self.negative_slope = 0.2
  
      self.head_channels = out_channels // self.heads
      self.scaling = self.head_channels**-0.5
  
      self.linear_msg = nn.Linear(in_channels, out_channels, bias=False)
  
      self.att = Parameter(
          torch.Tensor(1, self.heads, 2 * self.head_channels)
      )
  
      if bias:
          self.bias = Parameter(torch.Tensor(out_channels))
      else:
          self.register_parameter("bias", None)
  
      self.reset_parameters()
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch.nn import Parameter
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.inits import glorot, zeros
  from torch_geometric.utils import add_remaining_self_loops, softmax
  from torch_scatter import scatter_add
  from graphgym.config import cfg
  from graphgym.register import register_layer
label_desc: Use image node_id 1 to create a new GeneralAddAttConvLayer object from inherited base classes: MessagePassing with example: obj = GeneralAddAttConvLayer(in_channels, out_channels, improved, cached, bias)