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 __init__(
      self,
      n_actions,
      n_atoms,
      v_min,
      v_max,
      n_input_channels=4,
      activation=F.relu,
      bias=0.1,
  ):
      assert n_atoms >= 2
      assert v_min < v_max
  
      self.n_actions = n_actions
      self.n_input_channels = n_input_channels
      self.activation = activation
      self.n_atoms = n_atoms
  
      super().__init__()
      z_values = self.xp.linspace(
          v_min, v_max, num=n_atoms, dtype=np.float32
      )
      self.add_persistent("z_values", z_values)
  
      with self.init_scope():
          self.conv_layers = chainer.ChainList(
              L.Convolution2D(
                  n_input_channels, 32, 8, stride=4, initial_bias=bias
              ),
              L.Convolution2D(32, 64, 4, stride=2, initial_bias=bias),
              L.Convolution2D(64, 64, 3, stride=1, initial_bias=bias),
          )
  
          self.main_stream = L.Linear(3136, 1024)
          self.a_stream = L.Linear(512, n_actions * n_atoms)
          self.v_stream = L.Linear(512, n_atoms)
  
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 1 to create a new DistributionalDuelingDQN object from inherited base classes: chainer, StateQFunction, RecurrentChainMixin with example: obj = DistributionalDuelingDQN(n_actions, n_atoms, v_min, v_max, n_input_channels, activation, bias)