class_docstr: Simple Stage that stack GNN layers
  
  Args:
      dim_in (int): Input dimension
      dim_out (int): Output dimension
      num_layers (int): Number of GNN layers
code: def forward(self, batch):
      for i, layer in enumerate(self.children()):
          x = batch.x
          batch = layer(batch)
          if cfg.gnn.stage_type == "skipsum":
              batch.x = x + batch.x
          elif (
              cfg.gnn.stage_type == "skipconcat"
              and i < self.num_layers - 1
          ):
              batch.x = torch.cat([x, batch.x], dim=1)
      if cfg.gnn.l2norm:
          batch.x = F.normalize(batch.x, p=2, dim=-1)
      return batch
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  import graphgym.register
  from graphgym.config import cfg
  from graphgym.init import init_weights
  from graphgym.models.feature_encoder_pyg import edge_encoder_dict, node_encoder_dict
  from graphgym.models.head_pyg import head_dict
  from graphgym.models.layer_pyg import BatchNorm1dEdge, BatchNorm1dNode, GeneralLayer, GeneralMultiLayer
label_desc: Use image node_id 2 for calling the GNNStackStage obj's underlying member method code with example usage: obj.forward(batch) and returns: batch