class_docstr: Q function based on a CNN-MLP structure for continuous action space.
  
  This class implements a Q value network to predict Q based on the
  input state and action. It uses an CNN and a MLP to fit the function
  of Q(s, a).
  
  Args:
      env_spec (EnvSpec): Environment specification.
      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.
      hidden_sizes (tuple[int]): Output dimension of dense layer(s).
          For example, (32, 32) means the MLP of this q-function consists of
          two hidden layers, each with 32 hidden units.
      action_merge_layer (int): The index of layers at which to concatenate
          action inputs with the network. The indexing works like standard
          python list indexing. Index of 0 refers to the input layer
          (observation input) while an index of -1 points to the last
          hidden layer. Default parameter points to second layer from the
          end.
      name (str): Variable scope of the cnn.
      padding (str): The type of padding algorithm to use,
          either 'SAME' or 'VALID'.
      max_pooling (bool): Boolean for using max pooling layer or not.
      pool_shapes (tuple[int]): Dimension of the pooling layer(s). For
          example, (2, 2) means that all the pooling layers have
          shape (2, 2).
      pool_strides (tuple[int]): The strides of the pooling layer(s). For
          example, (2, 2) means that all the pooling layers have
          strides (2, 2).
      cnn_hidden_nonlinearity (callable): Activation function for
          intermediate dense layer(s) in the CNN. It should return a
          tf.Tensor. Set it to None to maintain a linear activation.
      hidden_nonlinearity (callable): Activation function for intermediate
          dense layer(s) in the MLP. 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) in the MLP. The function should
          return a tf.Tensor.
      hidden_b_init (callable): Initializer function for the bias
          of intermediate dense layer(s) in the MLP. The function should
          return a tf.Tensor.
      output_nonlinearity (callable): Activation function for output dense
          layer in the MLP. 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) in the MLP. The function should return
          a tf.Tensor.
      output_b_init (callable): Initializer function for the bias
          of output dense layer(s) in the MLP. The function should return
          a tf.Tensor.
      layer_normalization (bool): Bool for using layer normalization or not.
code: def __init__(
      self,
      env_spec,
      filters,
      strides,
      hidden_sizes=(256,),
      action_merge_layer=-2,
      name=None,
      padding="SAME",
      max_pooling=False,
      pool_strides=(2, 2),
      pool_shapes=(2, 2),
      cnn_hidden_nonlinearity=tf.nn.relu,
      hidden_nonlinearity=tf.nn.relu,
      hidden_w_init=tf.initializers.glorot_uniform(
          seed=deterministic.get_tf_seed_stream()
      ),
      hidden_b_init=tf.zeros_initializer(),
      output_nonlinearity=None,
      output_w_init=tf.initializers.glorot_uniform(
          seed=deterministic.get_tf_seed_stream()
      ),
      output_b_init=tf.zeros_initializer(),
      layer_normalization=False,
  ):
      if not isinstance(
          env_spec.observation_space, akro.Box
      ) or not len(env_spec.observation_space.shape) in (2, 3):
          raise ValueError(
              "{} can only process 2D, 3D akro.Image or"
              " akro.Box observations, but received an env_spec with "
              "observation_space of type {} and shape {}".format(
                  type(self).__name__,
                  type(env_spec.observation_space).__name__,
                  env_spec.observation_space.shape,
              )
          )
  
      self._env_spec = env_spec
      self._filters = filters
      self._strides = strides
      self._hidden_sizes = hidden_sizes
      self._action_merge_layer = action_merge_layer
      self._padding = padding
      self._max_pooling = max_pooling
      self._pool_strides = pool_strides
      self._pool_shapes = pool_shapes
      self._cnn_hidden_nonlinearity = cnn_hidden_nonlinearity
      self._hidden_nonlinearity = hidden_nonlinearity
      self._hidden_w_init = hidden_w_init
      self._hidden_b_init = hidden_b_init
      self._output_nonlinearity = output_nonlinearity
      self._output_w_init = output_w_init
      self._output_b_init = output_b_init
      self._layer_normalization = layer_normalization
  
      self._obs_dim = self._env_spec.observation_space.shape
      self._action_dim = self._env_spec.action_space.shape
  
      super().__init__(
          name=name,
          input_dim=self._obs_dim,
          filters=self._filters,
          strides=self._strides,
          hidden_sizes=self._hidden_sizes,
          action_merge_layer=self._action_merge_layer,
          padding=self._padding,
          max_pooling=self._max_pooling,
          pool_strides=self._pool_strides,
          pool_shapes=self._pool_shapes,
          cnn_hidden_nonlinearity=self._cnn_hidden_nonlinearity,
          hidden_nonlinearity=self._hidden_nonlinearity,
          hidden_w_init=self._hidden_w_init,
          hidden_b_init=self._hidden_b_init,
          output_nonlinearity=self._output_nonlinearity,
          output_w_init=self._output_w_init,
          output_b_init=self._output_b_init,
          layer_normalization=self._layer_normalization,
      )
  
      self._initialize()
  
file_path: garage/src/garage/tf/q_functions/continuous_cnn_q_function.py
imports: import akro
  import tensorflow
  from garage.experiment import deterministic
  from garage.tf.models import CNNMLPMergeModel
label_desc: Use image node_id 1 to create a new ContinuousCNNQFunction object from inherited base classes: CNNMLPMergeModel with example: obj = ContinuousCNNQFunction(env_spec, filters, strides, hidden_sizes, action_merge_layer, name, padding, max_pooling, pool_strides, pool_shapes, cnn_hidden_nonlinearity, hidden_nonlinearity, hidden_w_init, hidden_b_init, output_nonlinearity, output_w_init, output_b_init, layer_normalization)