class_docstr: A `GraphConv` layer with a trainable skip connection.
  
  **Mode**: single, disjoint, mixed, batch.
  
  This layer computes:
  $$
      \Z' = \D^{-1/2} \A \D^{-1/2} \X \W_1 + \X \W_2 + \b
  $$
  where \( \A \) does not have self-loops.
  
  **Input**
  
  - Node features of shape `([batch], n_nodes, n_node_features)`;
  - Normalized adjacency matrix of shape `([batch], n_nodes, n_nodes)`; can be computed
  with `spektral.utils.convolution.normalized_adjacency`.
  
  **Output**
  
  - Node features with the same shape as the input, but with the last
  dimension changed to `channels`.
  
  **Arguments**
  
  - `channels`: number of output channels;
  - `activation`: activation function;
  - `use_bias`: bool, add a bias vector to the output;
  - `kernel_initializer`: initializer for the weights;
  - `bias_initializer`: initializer for the bias vector;
  - `kernel_regularizer`: regularization applied to the weights;
  - `bias_regularizer`: regularization applied to the bias vector;
  - `activity_regularizer`: regularization applied to the output;
  - `kernel_constraint`: constraint applied to the weights;
  - `bias_constraint`: constraint applied to the bias vector.
class_docstr_tok: ["A","`","GraphConv","`","layer","with","a","trainable","skip","connection",".","*","*","Mode","*","*",":","single",",","disjoint",",","mixed",",","batch",".","This","layer","computes",":","$","$","\\Z","'","=","\\D^","{","-1\/2","}","\\A","\\D^","{","-1\/2","}","\\X","\\W_1","+","\\X","\\W_2","+","\\b","$","$","where","\\","(","\\A","\\",")","does","not","have","self-loops",".","*","*","Input","*","*","-","Node","features","of","shape","`","(","[","batch","]",",","n_nodes",",","n_node_features",")","`",";","-","Normalized","adjacency","matrix","of","shape","`","(","[","batch","]",",","n_nodes",",","n_nodes",")","`",";","can","be","computed","with","`","spektral.utils.convolution.normalized_adjacency","`",".","*","*","Output","*","*","-","Node","features","with","the","same","shape","as","the","input",",","but","with","the","last","dimension","changed","to","`","channels","`",".","*","*","Arguments","*","*","-","`","channels","`",":","number","of","output","channels",";","-","`","activation","`",":","activation","function",";","-","`","use_bias","`",":","bool",",","add","a","bias","vector","to","the","output",";","-","`","kernel_initializer","`",":","initializer","for","the","weights",";","-","`","bias_initializer","`",":","initializer","for","the","bias","vector",";","-","`","kernel_regularizer","`",":","regularization","applied","to","the","weights",";","-","`","bias_regularizer","`",":","regularization","applied","to","the","bias","vector",";","-","`","activity_regularizer","`",":","regularization","applied","to","the","output",";","-","`","kernel_constraint","`",":","constraint","applied","to","the","weights",";","-","`","bias_constraint","`",":","constraint","applied","to","the","bias","vector","."]
code: def build(self, input_shape):
      assert len(input_shape) >= 2
      input_dim = input_shape[0][-1]
  
      self.kernel_1 = self.add_weight(
          shape=(input_dim, self.channels),
          initializer=self.kernel_initializer,
          name="kernel_1",
          regularizer=self.kernel_regularizer,
          constraint=self.kernel_constraint,
      )
      self.kernel_2 = self.add_weight(
          shape=(input_dim, self.channels),
          initializer=self.kernel_initializer,
          name="kernel_2",
          regularizer=self.kernel_regularizer,
          constraint=self.kernel_constraint,
      )
      if self.use_bias:
          self.bias = self.add_weight(
              shape=(self.channels,),
              initializer=self.bias_initializer,
              name="bias",
              regularizer=self.bias_regularizer,
              constraint=self.bias_constraint,
          )
      self.built = True
  
file_path: spektral/spektral/layers/convolutional/gcs_conv.py
imports: from tensorflow.keras import backend
  from spektral.layers import ops
  from spektral.layers.convolutional.conv import Conv
  from spektral.utils import normalized_adjacency
label_desc: Use image node_id 2 for calling the GCSConv obj's underlying member method code with example usage: obj.build(input_shape) without return types