class_docstr: A feedforward network for use with IQN.
  
  IQN extends the Q-network of regular DQN which consists of torso and head
  networks. IQN embeds sampled quantile thresholds into the output space of the
  torso network and merges them with the torso output.
  
  Outputs a tuple consisting of (mean) Q-values, Q-value quantiles, and sampled
  quantile thresholds.
code: def __call__(self, observations):
      # Transform observations to intermediate representations (typically a
      # convolutional network).
      torso_output = self._torso(observations)
  
      # Now that dimension of intermediate representation is known initialize
      # embedding of sample quantile thresholds (only done once).
      self._create_embedding(torso_output.shape[-1])
  
      # Sample quantile thresholds.
      batch_size = tf.shape(observations)[0]
      tau_shape = tf.stack([batch_size, self._num_quantile_samples])
      tau = tf.random.uniform(tau_shape)
      indices = tf.range(1, self._latent_dim + 1, dtype=tf.float32)
  
      # Embed sampled quantile thresholds in intermediate representation space.
      tau_tiled = tf.tile(tau[:, :, None], (1, 1, self._latent_dim))
      indices_tiled = tf.tile(
          indices[None, None, :], tf.concat([tau_shape, [1]], 0)
      )
      tau_embedding = tf.cos(tau_tiled * indices_tiled * np.pi)
      tau_embedding = snt.BatchApply(self._embedding)(tau_embedding)
      tau_embedding = tf.nn.relu(tau_embedding)
  
      # Merge intermediate representations with embeddings, and apply head
      # network (typically an MLP).
      torso_output = tf.tile(
          torso_output[:, None, :], (1, self._num_quantile_samples, 1)
      )
      q_value_quantiles = snt.BatchApply(self._head)(
          tau_embedding * torso_output
      )
      q_dist = tf.transpose(q_value_quantiles, (0, 2, 1))
      q_values = tf.reduce_mean(q_value_quantiles, axis=1)
      q_values = tf.stop_gradient(q_values)
  
      return q_values, q_dist, tau
  
file_path: acme/acme/tf/networks/quantile.py
imports: import numpy
  import sonnet
  import tensorflow
label_desc: Use image node_id 3 for calling the IQNNetwork obj's underlying member method code with example usage: obj.__call__(observations) and returns: q_values,  q_dist,  tau