class_docstr: Skip block for GNN
code: def __init__(self, dim_in, dim_out, num_layers):
      super(GNNSkipBlock, self).__init__()
      if num_layers == 1:
          self.f = [GNNLayer(dim_in, dim_out, has_act=False)]
      else:
          self.f = []
          for i in range(num_layers - 1):
              d_in = dim_in if i == 0 else dim_out
              self.f.append(GNNLayer(d_in, dim_out))
          d_in = dim_in if num_layers == 1 else dim_out
          self.f.append(GNNLayer(d_in, dim_out, has_act=False))
      self.f = nn.Sequential(*self.f)
      self.act = act_dict[cfg.gnn.act]
      if cfg.gnn.stage_type == "skipsum":
          assert (
              dim_in == dim_out
          ), "Sum skip must have same dim_in, 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 GNNSkipBlock object from inherited base classes: nn with example: obj = GNNSkipBlock(dim_in, dim_out, num_layers)