class_docstr: Stage with skip connections
code: def __init__(self, dim_in, dim_out, num_layers):
      super(GNNSkipStage, self).__init__()
      assert num_layers % cfg.gnn.skip_every == 0, (
          "cfg.gnn.skip_every must be multiples of cfg.gnn.layer_mp"
          "(excluding head layer)"
      )
      for i in range(num_layers // cfg.gnn.skip_every):
          if cfg.gnn.stage_type == "skipsum":
              d_in = dim_in if i == 0 else dim_out
          elif cfg.gnn.stage_type == "skipconcat":
              d_in = dim_in if i == 0 else dim_in + i * dim_out
          block = GNNSkipBlock(d_in, dim_out, cfg.gnn.skip_every)
          self.add_module("block{}".format(i), block)
      if cfg.gnn.stage_type == "skipconcat":
          self.dim_out = d_in + dim_out
      else:
          self.dim_out = dim_out
  
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.act import act_dict
  from graphgym.models.feature_augment import Preprocess
  from graphgym.models.feature_encoder import edge_encoder_dict, node_encoder_dict
  from graphgym.models.head import head_dict
  from graphgym.models.layer import BatchNorm1dEdge, BatchNorm1dNode, GeneralLayer, GeneralMultiLayer
label_desc: Use image node_id 1 to create a new GNNSkipStage object from inherited base classes: nn with example: obj = GNNSkipStage(dim_in, dim_out, num_layers)