class_docstr: The 2D convolution layer used by the feature encoder in PointNet.
class_docstr_tok: ["The","2D","convolution","layer","used","by","the","feature","encoder","in","PointNet","."]
docstr: Executes the convolution.
  
  Args:
    inputs: a dense tensor of size `[B, N, 1, D]`.
    training: flag to control batch normalization update statistics.
  
  Returns:
    Tensor with shape `[B, N, 1, C]`.
docstr_tok: ["Executes","the","convolution",".","Args",":","inputs",":","a","dense","tensor","of","size","`","[","B",",","N",",","1",",","D","]","`",".","training",":","flag","to","control","batch","normalization","update","statistics",".","Returns",":","Tensor","with","shape","`","[","B",",","N",",","1",",","C","]","`","."]
code: def call(
      self, inputs: tf.Tensor, training: Optional[bool] = None
  ) -> tf.Tensor:  # pylint: disable=arguments-differ
      """Executes the convolution.
  
      Args:
        inputs: a dense tensor of size `[B, N, 1, D]`.
        training: flag to control batch normalization update statistics.
  
      Returns:
        Tensor with shape `[B, N, 1, C]`.
      """
      return tf.nn.relu(self.bn(self.conv(inputs), training))
  
imports: from typing import Optional
  import tensorflow
  from tensorflow_graphics.util import export_api
label_desc: Use image node_id 3 for calling the PointNetConv2Layer obj's underlying member method code with example usage: obj.call(inputs, training) and returns: tf