class_docstr: Distributional dueling fully-connected Q-function with discrete actions.
  
      
class_docstr_tok: ["Distributional","dueling","fully-connected","Q-function","with","discrete","actions","."]
code: def __call__(self, x):
      h = x
      for link in self.conv_layers:
          h = self.activation(link(h))
  
      # Advantage
      batch_size = x.shape[0]
  
      h = self.activation(self.main_stream(h))
      h_a, h_v = F.split_axis(h, 2, axis=-1)
      ya = F.reshape(
          self.a_stream(h_a), (batch_size, self.n_actions, self.n_atoms)
      )
  
      mean = F.sum(ya, axis=1, keepdims=True) / self.n_actions
  
      ya, mean = F.broadcast(ya, mean)
      ya -= mean
  
      # State value
      ys = F.reshape(self.v_stream(h_v), (batch_size, 1, self.n_atoms))
      ya, ys = F.broadcast(ya, ys)
      q = F.softmax(ya + ys, axis=2)
  
      return action_value.DistributionalDiscreteActionValue(
          q, self.z_values
      )
  
file_path: chainerrl/chainerrl/q_functions/dueling_dqn.py
imports: import chainer
  from chainer import functions
  from chainer import links
  import numpy
  from chainerrl import action_value
  from chainerrl.links.mlp import MLP
  from chainerrl.q_function import StateQFunction
  from chainerrl.recurrent import RecurrentChainMixin
label_desc: Use image node_id 2 for calling the DistributionalDuelingDQN obj's underlying member method code with example usage: obj.__call__(x) and returns: action_value