class_docstr: A GraphSAGE layer from the paper
  
  > [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216)<br>
  > William L. Hamilton et al.
  
  **Mode**: single, disjoint, mixed.
  
  **This layer expects a sparse adjacency matrix.**
  
  This layer computes:
  $$
      \X' = \big[ \textrm{AGGREGATE}(\X) \| \X \big] \W + \b; \\
      \X' = \frac{\X'}{\|\X'\|}
  $$
  where \( \textrm{AGGREGATE} \) is a function to aggregate a node's
  neighbourhood. The supported aggregation methods are: sum, mean,
  max, min, and product.
  
  **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 as the input, but with the last
  dimension changed to `channels`.
  
  **Arguments**
  
  - `channels`: number of output channels;
  - `aggregate_op`: str, aggregation method to use (`'sum'`, `'mean'`,
  `'max'`, `'min'`, `'prod'`);
  - `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}
  
file_path: spektral/spektral/layers/convolutional/graphsage_conv.py
imports: from tensorflow.keras import backend
  from spektral.layers import ops
  from spektral.layers.convolutional.message_passing import MessagePassing
label_desc: Use image node_id 4 for calling the GraphSageConv obj's underlying member method code with example usage: obj.config() and returns: dict