class_docstr: The Graph Neural Network from `"Graph Attention Networks"
  <https://arxiv.org/abs/1710.10903>`_ or `"How Attentive are Graph Attention
  Networks?" <https://arxiv.org/abs/2105.14491>`_ papers, using the
  :class:`~torch_geometric.nn.GATConv` or
  :class:`~torch_geometric.nn.GATv2Conv` operator for message passing,
  respectively.
  
  Args:
      in_channels (int or tuple): Size of each input sample, or :obj:`-1` to
          derive the size from the first input(s) to the forward method.
          A tuple corresponds to the sizes of source and target
          dimensionalities.
      hidden_channels (int): Size of each hidden sample.
      num_layers (int): Number of message passing layers.
      out_channels (int, optional): If not set to :obj:`None`, will apply a
          final linear transformation to convert hidden node embeddings to
          output size :obj:`out_channels`. (default: :obj:`None`)
      v2 (bool, optional): If set to :obj:`True`, will make use of
          :class:`~torch_geometric.nn.conv.GATv2Conv` rather than
          :class:`~torch_geometric.nn.conv.GATConv`. (default: :obj:`False`)
      dropout (float, optional): Dropout probability. (default: :obj:`0.`)
      act (str or Callable, optional): The non-linear activation function to
          use. (default: :obj:`"relu"`)
      act_first (bool, optional): If set to :obj:`True`, activation is
          applied before normalization. (default: :obj:`False`)
      act_kwargs (Dict[str, Any], optional): Arguments passed to the
          respective activation function defined by :obj:`act`.
          (default: :obj:`None`)
      norm (str or Callable, optional): The normalization function to
          use. (default: :obj:`None`)
      norm_kwargs (Dict[str, Any], optional): Arguments passed to the
          respective normalization function defined by :obj:`norm`.
          (default: :obj:`None`)
      jk (str, optional): The Jumping Knowledge mode. If specified, the model
          will additionally apply a final linear transformation to transform
          node embeddings to the expected output feature dimensionality.
          (:obj:`None`, :obj:`"last"`, :obj:`"cat"`, :obj:`"max"`,
          :obj:`"lstm"`). (default: :obj:`None`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.GATConv` or
          :class:`torch_geometric.nn.conv.GATv2Conv`.
code: def init_conv(
      self,
      in_channels: Union[int, Tuple[int, int]],
      out_channels: int,
      **kwargs,
  ) -> MessagePassing:
      v2 = kwargs.pop("v2", False)
      heads = kwargs.pop("heads", 1)
      concat = kwargs.pop("concat", True)
  
      # Do not use concatenation in case the layer `GATConv` layer maps to
      # the desired output channels (out_channels != None and jk != None):
      if getattr(self, "_is_conv_to_out", False):
          concat = False
  
      if concat and out_channels % heads != 0:
          raise ValueError(
              f"Ensure that the number of output channels of "
              f"'GATConv' (got '{out_channels}') is divisible "
              f"by the number of heads (got '{heads}')"
          )
  
      if concat:
          out_channels = out_channels // heads
  
      Conv = GATConv if not v2 else GATv2Conv
      return Conv(
          in_channels,
          out_channels,
          heads=heads,
          concat=concat,
          dropout=self.dropout.p,
          **kwargs,
      )
  
imports: import copy
  import inspect
  from typing import Any, Callable, Dict, Final, List, Optional, Tuple, Union
  import torch
  from torch import Tensor
  from torch.nn import Linear, ModuleList
  from tqdm import tqdm
  from torch_geometric.data import Data
  from torch_geometric.loader import CachedLoader, NeighborLoader
  from torch_geometric.nn.conv import EdgeConv, GATConv, GATv2Conv, GCNConv, GINConv, MessagePassing, PNAConv, SAGEConv
  from torch_geometric.nn.models import MLP
  from torch_geometric.nn.models.jumping_knowledge import JumpingKnowledge
  from torch_geometric.nn.resolver import activation_resolver, normalization_resolver
  from torch_geometric.typing import Adj, OptTensor
  from torch_geometric.utils._trim_to_layer import TrimToLayer
label_desc: Use image node_id 1 for calling the GAT obj's underlying member method code with example usage: obj.init_conv(in_channels, out_channels) and returns: Conv