class_docstr: A CensNet convolutional layer from the paper
  
  > [Co-embedding of Nodes and Edges with Graph Neural Networks](https://arxiv.org/abs/2010.13242)<br>
  > Xiaodong Jiang et al.
  
  This implements both the node and edge propagation rules as a single layer.
  
  **Mode**: single, disjoint, batch.
  
  **Input**
  
  - Node features of shape `([batch], n_nodes, n_node_features)`;
  - A tuple containing:
      - Modified Laplacian of shape `([batch], n_nodes, n_nodes)`; can be
          computed with `spektral.utils.convolution.gcn_filter`.
      - Modified line graph Laplacian of shape `([batch], n_edges, n_edges)`;
          can be computed with `spektral.utils.convolution.line_graph` and
          `spektral.utils.convolution.gcn_filter`.
      - Incidence matrix of shape `([batch], n_nodes, n_edges)`; can be
          computed with `spektral.utils.convolution.incidence_matrix`.
  - Edge features of shape `([batch], n_edges, n_edge_features)`;
  
  **Output**
  
  - Node features with the same shape as the input, but with the last
  dimension changed to `node_channels`.
  - Edge features with the same shape as the input, but with the last
  dimension changed to `edge_channels`.
  
  **Arguments**
  
  - `node_channels`: number of output channels for the node features;
  - `edge_channels`: number of output channels for the edge features;
  - `activation`: activation function;
  - `use_bias`: bool, add a bias vector to the output;
  - `kernel_initializer`: initializer for the weights;
  - `node_initializer`: initializer for the node feature weights (P_n);
  - `edge_initializer`: initializer for the edge feature weights (P_e);
  - `bias_initializer`: initializer for the bias vector;
  - `kernel_regularizer`: regularization applied to the weights;
  - `edge_regularizer`: regularization applied to the edge feature weights;
  - `bias_regularizer`: regularization applied to the bias vector;
  - `activity_regularizer`: regularization applied to the output;
  - `kernel_constraint`: constraint applied to the weights;
  - `edge_constraint`: constraint applied to the edge feature weights;
  - `bias_constraint`: constraint applied to the bias vector.
docstr: Applies the bias, activation, and mask, if necessary.
  
  :param pre_activation: The layer output, pre-activation.
  :param bias_weights: The weights to use for the bias.
  :param mask: The mask to use.
  :return: The biased, activated, and masked output.
docstr_tok: ["Applies","the","bias",",","activation",",","and","mask",",","if","necessary",".",":","param","pre_activation",":","The","layer","output",",","pre-activation",".",":","param","bias_weights",":","The","weights","to","use","for","the","bias",".",":","param","mask",":","The","mask","to","use",".",":","return",":","The","biased",",","activated",",","and","masked","output","."]
code: def _bias_and_activation(
      self, pre_activation, *, bias_weights, mask=None
  ):
      """
      Applies the bias, activation, and mask, if necessary.
  
      :param pre_activation: The layer output, pre-activation.
      :param bias_weights: The weights to use for the bias.
      :param mask: The mask to use.
      :return: The biased, activated, and masked output.
      """
  
      if self.use_bias:
          # Apply the bias if needed.
          pre_activation = tf.nn.bias_add(pre_activation, bias_weights)
      if mask is not None:
          pre_activation *= mask[0]
      return self.activation(pre_activation)
  
file_path: spektral/spektral/layers/convolutional/censnet_conv.py
imports: import tensorflow
  from spektral.layers import ops
  from spektral.layers.convolutional.conv import Conv
  from spektral.utils.convolution import gcn_filter, incidence_matrix, line_graph
label_desc: Use image node_id 3 for calling the CensNetConv obj's underlying member method code with example usage: obj._bias_and_activation(pre_activation) and returns: self