class_docstr: This model, with its default hyperparameters, implements the architecture
  from the paper:
  
  > [Semi-Supervised Classification with Graph Convolutional Networks](https://arxiv.org/abs/1609.02907)<br>
  > Thomas N. Kipf and Max Welling
  
  **Mode**: single, disjoint, mixed, batch.
  
  **Input**
  
  - Node features of shape `([batch], n_nodes, n_node_features)`
  - Weighted adjacency matrix of shape `([batch], n_nodes, n_nodes)`
  
  **Output**
  
  - Softmax predictions with shape `([batch], n_nodes, n_labels)`.
  
  **Arguments**
  
  - `n_labels`: number of channels in output;
  - `channels`: number of channels in first GCNConv layer;
  - `activation`: activation of the first GCNConv layer;
  - `output_activation`: activation of the second GCNConv layer;
  - `use_bias`: whether to add a learnable bias to the two GCNConv layers;
  - `dropout_rate`: `rate` used in `Dropout` layers;
  - `l2_reg`: l2 regularization strength;
  - `**kwargs`: passed to `Model.__init__`.
code: def call(self, inputs):
      if len(inputs) == 2:
          x, a = inputs
      else:
          (
              x,
              a,
              _,
          ) = inputs  # So that the model can be used with DisjointLoader
  
      x = self._d0(x)
      x = self._gcn0([x, a])
      x = self._d1(x)
      return self._gcn1([x, a])
  
imports: import tensorflow
  from spektral.layers.convolutional import gcn_conv
label_desc: Use image node_id 3 for calling the GCN obj's underlying member method code with example usage: obj.call(inputs) and returns: self