class_docstr: A Graph Isomorphism Network (GIN) from the paper
  
  > [How Powerful are Graph Neural Networks?](https://arxiv.org/abs/1810.00826)<br>
  > Keyulu Xu et al.
  
  **Mode**: single, disjoint, mixed.
  
  **This layer expects a sparse adjacency matrix.**
  
  This layer computes for each node \(i\):
  $$
      \x_i' = \textrm{MLP}\big( (1 + \epsilon) \cdot \x_i + \sum\limits_{j
      \in \mathcal{N}(i)} \x_j \big)
  $$
  where \(\textrm{MLP}\) is a multi-layer perceptron.
  
  **Input**
  
  - Node features of shape `(n_nodes, n_node_features)`;
  - Binary adjacency matrix of shape `(n_nodes, n_nodes)`.
  
  **Output**
  
  - Node features with the same shape of the input, but the last dimension
  changed to `channels`.
  
  **Arguments**
  
  - `channels`: integer, number of output channels;
  - `epsilon`: unnamed parameter, see the original paper and the equation
  above.
  By setting `epsilon=None`, the parameter will be learned (default behaviour).
  If given as a value, the parameter will stay fixed.
  - `mlp_hidden`: list of integers, number of hidden units for each hidden
  layer in the MLP (if None, the MLP has only the output layer);
  - `mlp_activation`: activation for the MLP layers;
  - `mlp_batchnorm`: apply batch normalization after every hidden layer of the MLP;
  - `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","Graph","Isomorphism","Network","(","GIN",")","from","the","paper",">","[","How","Powerful","are","Graph","Neural","Networks","?","]","(","https",":","\/\/arxiv.org\/abs\/1810.00826",")","<","br",">",">","Keyulu","Xu","et","al",".","*","*","Mode","*","*",":","single",",","disjoint",",","mixed",".","*","*","This","layer","expects","a","sparse","adjacency","matrix",".","*","*","This","layer","computes","for","each","node","\\","(","i\\",")",":","$","$","\\x_i","'","=","\\textrm","{","MLP","}","\\big","(","(","1","+","\\epsilon",")","\\cdot","\\x_i","+","\\sum\\limits_","{","j","\\in","\\mathcal","{","N","}","(","i",")","}","\\x_j","\\big",")","$","$","where","\\","(","\\textrm","{","MLP","}","\\",")","is","a","multi-layer","perceptron",".","*","*","Input","*","*","-","Node","features","of","shape","`","(","n_nodes",",","n_node_features",")","`",";","-","Binary","adjacency","matrix","of","shape","`","(","n_nodes",",","n_nodes",")","`",".","*","*","Output","*","*","-","Node","features","with","the","same","shape","of","the","input",",","but","the","last","dimension","changed","to","`","channels","`",".","*","*","Arguments","*","*","-","`","channels","`",":","integer",",","number","of","output","channels",";","-","`","epsilon","`",":","unnamed","parameter",",","see","the","original","paper","and","the","equation","above",".","By","setting","`","epsilon=None","`",",","the","parameter","will","be","learned","(","default","behaviour",")",".","If","given","as","a","value",",","the","parameter","will","stay","fixed",".","-","`","mlp_hidden","`",":","list","of","integers",",","number","of","hidden","units","for","each","hidden","layer","in","the","MLP","(","if","None",",","the","MLP","has","only","the","output","layer",")",";","-","`","mlp_activation","`",":","activation","for","the","MLP","layers",";","-","`","mlp_batchnorm","`",":","apply","batch","normalization","after","every","hidden","layer","of","the","MLP",";","-","`","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 config(self):
      return {
          "channels": self.channels,
          "epsilon": self.epsilon,
          "mlp_hidden": self.mlp_hidden,
          "mlp_activation": self.mlp_activation,
          "mlp_batchnorm": self.mlp_batchnorm,
      }
  
file_path: spektral/spektral/layers/convolutional/gin_conv.py
imports: import tensorflow
  from tensorflow.keras import activations
  from tensorflow.keras.layers import BatchNormalization, Dense
  from tensorflow.keras.models import Sequential
  from spektral.layers import ops
  from spektral.layers.convolutional.message_passing import MessagePassing
label_desc: Use image node_id 4 for calling the GINConv obj's underlying member method code with example usage: obj.config() and returns: dict