class_docstr: Head module for defining a distributional dueling network.
  
  This module expects a (batch_size, in_size)-shaped `torch.Tensor` as input
  and returns `pfrl.action_value.DistributionalDiscreteActionValue`.
  
  Args:
      in_size (int): Input size.
      n_actions (int): Number of actions.
      n_atoms (int): Number of atoms.
      v_min (float): Minimum value represented by atoms.
      v_max (float): Maximum value represented by atoms.
class_docstr_tok: ["Head","module","for","defining","a","distributional","dueling","network",".","This","module","expects","a","(","batch_size",",","in_size",")","-shaped","`","torch.Tensor","`","as","input","and","returns","`","pfrl.action_value.DistributionalDiscreteActionValue","`",".","Args",":","in_size","(","int",")",":","Input","size",".","n_actions","(","int",")",":","Number","of","actions",".","n_atoms","(","int",")",":","Number","of","atoms",".","v_min","(","float",")",":","Minimum","value","represented","by","atoms",".","v_max","(","float",")",":","Maximum","value","represented","by","atoms","."]
code: def forward(self, h):
      h_a, h_v = torch.chunk(h, 2, dim=1)
      a_logits = self.a_stream(h_a).reshape(
          (-1, self.n_actions, self.n_atoms)
      )
      a_logits = a_logits - a_logits.mean(dim=1, keepdim=True)
      v_logits = self.v_stream(h_v).reshape((-1, 1, self.n_atoms))
      probs = nn.functional.softmax(a_logits + v_logits, dim=2)
      return pfrl.action_value.DistributionalDiscreteActionValue(
          probs, self.z_values
      )
  
file_path: pfrl/examples/slimevolley/train_rainbow.py
imports: import argparse
  import gym
  import gym.spaces
  import numpy
  import torch
  from torch import nn
  import pfrl
  from pfrl import agents, experiments, explorers
  from pfrl import nn
  from pfrl import replay_buffers, utils
label_desc: Use image node_id 2 for calling the DistributionalDuelingHead obj's underlying member method code with example usage: obj.forward(h) and returns: pfrl