class_docstr: Categorical CNN Model.
  
  A model represented by a Categorical distribution
  which is parameterized by a convolutional neural network (CNN) followed
  by a multilayer perceptron (MLP).
  
  Args:
      input_dim (Tuple[int, int, int]): Dimensions of unflattened input,
          which means [in_height, in_width, in_channels]. If the last 3
          dimensions of input_var is not this shape, it will be reshaped.
      output_dim (int): Dimension of the network output.
      filters (Tuple[Tuple[int, Tuple[int, int]], ...]): Number and dimension
          of filters. For example, ((3, (3, 5)), (32, (3, 3))) means there
          are two convolutional layers. The filter for the first layer have 3
          channels and its shape is (3 x 5), while the filter for the second
          layer have 32 channels and its shape is (3 x 3).
      strides (tuple[int]): The stride of the sliding window. For example,
          (1, 2) means there are two convolutional layers. The stride of the
          filter for first layer is 1 and that of the second layer is 2.
      padding (str): The type of padding algorithm to use,
          either 'SAME' or 'VALID'.
      hidden_sizes (list[int]): Output dimension of dense layer(s).
          For example, (32, 32) means this MLP consists of two
          hidden layers, each with 32 hidden units.
      name (str): Model name, also the variable scope.
      is_image (bool): Whether observations are images or not.
      hidden_nonlinearity (callable): Activation function for intermediate
          dense layer(s). It should return a tf.Tensor. Set it to
          None to maintain a linear activation.
      hidden_w_init (callable): Initializer function for the weight
          of intermediate dense layer(s). The function should return a
          tf.Tensor.
      hidden_b_init (callable): Initializer function for the bias
          of intermediate dense layer(s). The function should return a
          tf.Tensor.
      output_nonlinearity (callable): Activation function for output dense
          layer. It should return a tf.Tensor. Set it to None to
          maintain a linear activation.
      output_w_init (callable): Initializer function for the weight
          of output dense layer(s). The function should return a
          tf.Tensor.
      output_b_init (callable): Initializer function for the bias
          of output dense layer(s). The function should return a
          tf.Tensor.
      layer_normalization (bool): Bool for using layer normalization or not.
docstr: Build model.
  
  Args:
      state_input (tf.Tensor): Observation inputs.
      name (str): Inner model name, also the variable scope of the
          inner model, if exist. One example is
          garage.tf.models.Sequential.
  
  Returns:
      tfp.distributions.OneHotCategorical: Policy distribution.
docstr_tok: ["Build","model",".","Args",":","state_input","(","tf.Tensor",")",":","Observation","inputs",".","name","(","str",")",":","Inner","model","name",",","also","the","variable","scope","of","the","inner","model",",","if","exist",".","One","example","is","garage.tf.models.Sequential",".","Returns",":","tfp.distributions.OneHotCategorical",":","Policy","distribution","."]
code: def _build(self, state_input, name=None):
      """Build model.
  
      Args:
          state_input (tf.Tensor): Observation inputs.
          name (str): Inner model name, also the variable scope of the
              inner model, if exist. One example is
              garage.tf.models.Sequential.
  
      Returns:
          tfp.distributions.OneHotCategorical: Policy distribution.
  
      """
      if self._is_image:
          augmented_state_input = tf.cast(state_input, tf.float32)
          augmented_state_input /= 255.0
      else:
          augmented_state_input = state_input
      time_dim = tf.shape(augmented_state_input)[1]
      dim = augmented_state_input.get_shape()[2:].as_list()
      augmented_state_input = tf.reshape(
          augmented_state_input, [-1, *dim]
      )
      cnn_output = self._cnn_model.build(
          augmented_state_input, name=name
      ).outputs
      dim = cnn_output.get_shape()[-1]
      cnn_output = tf.reshape(cnn_output, [-1, time_dim, dim])
      mlp_output = self._mlp_model.build(cnn_output, name=name).dist
      return mlp_output
  
file_path: garage/src/garage/tf/models/categorical_cnn_model.py
imports: import tensorflow
  from garage.experiment import deterministic
  from garage.tf.models.categorical_mlp_model import CategoricalMLPModel
  from garage.tf.models.cnn_model import CNNModel
  from garage.tf.models.model import Model
label_desc: Use image node_id 3 for calling the CategoricalCNNModel obj's underlying member method code with example usage: obj._build(state_input, name) and returns: mlp_output