class_docstr: General GNN layer
      
class_docstr_tok: ["General","GNN","layer"]
code: def __init__(
      self,
      in_channels,
      out_channels,
      improved=False,
      cached=False,
      bias=True,
      **kwargs,
  ):
      super(GeneralConvLayerV2, self).__init__(
          aggr=cfg.gnn.agg, flow=cfg.gnn.flow, **kwargs
      )
  
      self.in_channels = in_channels
      self.out_channels = out_channels
      self.improved = improved
      self.cached = cached
      self.normalize = cfg.gnn.normalize_adj
  
      self.weight = Parameter(torch.Tensor(in_channels, out_channels))
      if cfg.gnn.self_msg == "concat":
          self.weight_self = Parameter(
              torch.Tensor(in_channels, out_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
  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, is_undirected
  from torch_scatter import scatter_add
  from graphgym.config import cfg
label_desc: Use image node_id 1 to create a new GeneralConvLayerV2 object from inherited base classes: MessagePassing with example: obj = GeneralConvLayerV2(in_channels, out_channels, improved, cached, bias)