class_docstr: Graph Convolution (GCN) Keras layer.
  The implementation is based on https://github.com/tkipf/keras-gcn.
  
  Original paper: Semi-Supervised Classification with Graph Convolutional Networks. Thomas N. Kipf, Max Welling,
  International Conference on Learning Representations (ICLR), 2017 https://github.com/tkipf/gcn
  
  Notes:
    - The batch axis represents independent graphs to be convolved with this GCN kernel (for
      instance, for full-batch node prediction on a single graph, its dimension should be 1).
  
    - If the adjacency matrix is dense, both it and the features should have a batch axis, with
      equal batch dimension.
  
    - If the adjacency matrix is sparse, it should not have a batch axis, and the batch
      dimension of the features must be 1.
  
    - There are two inputs required, the node features,
      and the normalized graph Laplacian matrix
  
    - This class assumes that the normalized Laplacian matrix is passed as
      input to the Keras methods.
  
  .. seealso:: :class:`.GCN` combines several of these layers.
  
  Args:
      units (int): dimensionality of output feature vectors
      activation (str or func): nonlinear activation applied to layer's output to obtain output features
      use_bias (bool): toggles an optional bias
      final_layer (bool): Deprecated, use ``tf.gather`` or :class:`.GatherIndices`
      kernel_initializer (str or func, optional): The initialiser to use for the weights.
      kernel_regularizer (str or func, optional): The regulariser to use for the weights.
      kernel_constraint (str or func, optional): The constraint to use for the weights.
      bias_initializer (str or func, optional): The initialiser to use for the bias.
      bias_regularizer (str or func, optional): The regulariser to use for the bias.
      bias_constraint (str or func, optional): The constraint to use for the bias.
class_docstr_tok: ["Graph","Convolution","(","GCN",")","Keras","layer",".","The","implementation","is","based","on","https",":","\/\/github.com\/tkipf\/keras-gcn",".","Original","paper",":","Semi-Supervised","Classification","with","Graph","Convolutional","Networks",".","Thomas","N.","Kipf",",","Max","Welling",",","International","Conference","on","Learning","Representations","(","ICLR",")",",","2017","https",":","\/\/github.com\/tkipf\/gcn","Notes",":","-","The","batch","axis","represents","independent","graphs","to","be","convolved","with","this","GCN","kernel","(","for","instance",",","for","full-batch","node","prediction","on","a","single","graph",",","its","dimension","should","be","1",")",".","-","If","the","adjacency","matrix","is","dense",",","both","it","and","the","features","should","have","a","batch","axis",",","with","equal","batch","dimension",".","-","If","the","adjacency","matrix","is","sparse",",","it","should","not","have","a","batch","axis",",","and","the","batch","dimension","of","the","features","must","be","1",".","-","There","are","two","inputs","required",",","the","node","features",",","and","the","normalized","graph","Laplacian","matrix","-","This","class","assumes","that","the","normalized","Laplacian","matrix","is","passed","as","input","to","the","Keras","methods",".","..","seealso",":",":",":","class",":","`",".GCN","`","combines","several","of","these","layers",".","Args",":","units","(","int",")",":","dimensionality","of","output","feature","vectors","activation","(","str","or","func",")",":","nonlinear","activation","applied","to","layer","'s","output","to","obtain","output","features","use_bias","(","bool",")",":","toggles","an","optional","bias","final_layer","(","bool",")",":","Deprecated",",","use","``","tf.gather","``","or",":","class",":","`",".GatherIndices","`","kernel_initializer","(","str","or","func",",","optional",")",":","The","initialiser","to","use","for","the","weights",".","kernel_regularizer","(","str","or","func",",","optional",")",":","The","regulariser","to","use","for","the","weights",".","kernel_constraint","(","str","or","func",",","optional",")",":","The","constraint","to","use","for","the","weights",".","bias_initializer","(","str","or","func",",","optional",")",":","The","initialiser","to","use","for","the","bias",".","bias_regularizer","(","str","or","func",",","optional",")",":","The","regulariser","to","use","for","the","bias",".","bias_constraint","(","str","or","func",",","optional",")",":","The","constraint","to","use","for","the","bias","."]
docstr: Applies the layer.
  
  Args:
      inputs (list): a list of 3 input tensors that includes
          node features (size 1 x N x F),
          graph adjacency matrix (size N x N),
          where N is the number of nodes in the graph, and
          F is the dimensionality of node features.
  
  Returns:
      Keras Tensor that represents the output of the layer.
docstr_tok: ["Applies","the","layer",".","Args",":","inputs","(","list",")",":","a","list","of","3","input","tensors","that","includes","node","features","(","size","1","x","N","x","F",")",",","graph","adjacency","matrix","(","size","N","x","N",")",",","where","N","is","the","number","of","nodes","in","the","graph",",","and","F","is","the","dimensionality","of","node","features",".","Returns",":","Keras","Tensor","that","represents","the","output","of","the","layer","."]
code: def call(self, inputs):
      """
      Applies the layer.
  
      Args:
          inputs (list): a list of 3 input tensors that includes
              node features (size 1 x N x F),
              graph adjacency matrix (size N x N),
              where N is the number of nodes in the graph, and
              F is the dimensionality of node features.
  
      Returns:
          Keras Tensor that represents the output of the layer.
      """
      features, *As = inputs
  
      # Calculate the layer operation of GCN
      A = As[0]
      if K.is_sparse(A):
          # FIXME(#1222): batch_dot doesn't support sparse tensors, so we special case them to
          # only work with a single batch element (and the adjacency matrix without a batch
          # dimension)
          if features.shape[0] != 1:
              raise ValueError(
                  f"features: expected batch dimension = 1 when using sparse adjacency matrix in GraphConvolution, found features batch dimension {features.shape[0]}"
              )
          if len(A.shape) != 2:
              raise ValueError(
                  f"adjacency: expected a single adjacency matrix when using sparse adjacency matrix in GraphConvolution (tensor of rank 2), found adjacency tensor of rank {len(A.shape)}"
              )
  
          features_sq = K.squeeze(features, axis=0)
          h_graph = K.dot(A, features_sq)
          h_graph = K.expand_dims(h_graph, axis=0)
      else:
          h_graph = K.batch_dot(A, features)
      output = K.dot(h_graph, self.kernel)
  
      # Add optional bias & apply activation
      if self.bias is not None:
          output += self.bias
      output = self.activation(output)
  
      return output
  
imports: import warnings
  import tensorflow
  from tensorflow.keras import backend
  from tensorflow.keras import activations, initializers, constraints, regularizers
  from tensorflow.keras.layers import Input, Layer, Lambda, Dropout, Reshape
  from ..mapper import FullBatchGenerator, ClusterNodeGenerator
  from .misc import SqueezedSparseConversion, deprecated_model_function, GatherIndices
  from .preprocessing_layer import GraphPreProcessingLayer
label_desc: Use image node_id 5 for calling the GraphConvolution obj's underlying member method code with example usage: obj.call(inputs) and returns: output