class_docstr: The PointNet classification head.
  
  The head consists of 2x PointNetDenseLayer layers (512 and 256 channels)
  followed by a dropout layer (drop rate=30%) a dense linear layer producing the
  logits of the num_classes classes.
class_docstr_tok: ["The","PointNet","classification","head",".","The","head","consists","of","2x","PointNetDenseLayer","layers","(","512","and","256","channels",")","followed","by","a","dropout","layer","(","drop","rate=30","%",")","a","dense","linear","layer","producing","the","logits","of","the","num_classes","classes","."]
docstr: Constructor.
  
  Args:
    num_classes: the number of classes to classify.
    momentum: the momentum used for the batch normalization layer.
    dropout_rate: the dropout rate for fully connected layer
docstr_tok: ["Constructor",".","Args",":","num_classes",":","the","number","of","classes","to","classify",".","momentum",":","the","momentum","used","for","the","batch","normalization","layer",".","dropout_rate",":","the","dropout","rate","for","fully","connected","layer"]
code: def __init__(
      self,
      num_classes: int = 40,
      momentum: float = 0.5,
      dropout_rate: float = 0.3,
  ):
      """Constructor.
  
      Args:
        num_classes: the number of classes to classify.
        momentum: the momentum used for the batch normalization layer.
        dropout_rate: the dropout rate for fully connected layer
      """
      super(ClassificationHead, self).__init__()
      self.dense1 = PointNetDenseLayer(512, momentum)
      self.dense2 = PointNetDenseLayer(256, momentum)
      self.dropout = tf.keras.layers.Dropout(dropout_rate)
      self.dense3 = tf.keras.layers.Dense(
          num_classes, activation="linear"
      )
  
imports: from typing import Optional
  import tensorflow
  from tensorflow_graphics.util import export_api
label_desc: Use image node_id 1 to create a new ClassificationHead object from inherited base classes: tf.keras.layers with example: obj = ClassificationHead(num_classes, momentum, dropout_rate)