code: def _build_module(self, input_layer):
      # state value tower - V
      with tf.variable_scope("state_value"):
          self.state_value = self.dense_layer(512)(
              input_layer,
              activation=self.activation_function,
              name="fc1",
          )
          self.state_value = self.dense_layer(1)(
              self.state_value, name="fc2"
          )
  
      # action advantage tower - A
      with tf.variable_scope("action_advantage"):
          self.action_advantage = self.dense_layer(512)(
              input_layer,
              activation=self.activation_function,
              name="fc1",
          )
          self.action_advantage = self.dense_layer(self.num_actions)(
              self.action_advantage, name="fc2"
          )
          self.action_mean = tf.reduce_mean(
              self.action_advantage, axis=1, keepdims=True
          )
          self.action_advantage = (
              self.action_advantage - self.action_mean
          )
  
      # merge to state-action value function Q
      self.q_values = self.output = tf.add(
          self.state_value, self.action_advantage, name="output"
      )
  
      # used in batch-rl to estimate a probablity distribution over actions
      self.softmax = self.add_softmax_with_temperature()
  
file_path: coach/rl_coach/architectures/tensorflow_components/heads/dueling_q_head.py
imports: import tensorflow
  from rl_coach.architectures.tensorflow_components.layers import Dense
  from rl_coach.architectures.tensorflow_components.heads.q_head import QHead
  from rl_coach.base_parameters import AgentParameters
  from rl_coach.spaces import SpacesDefinition
label_desc: Use image node_id 2 for calling the DuelingQHead obj's underlying member method code with example usage: obj._build_module(input_layer) without return types