code: def _build_discrete_net(self, input_layer, action_space):
      num_actions = len(action_space.actions)
      self.actions.append(
          tf.placeholder(tf.int32, [None], name="actions")
      )
  
      policy_values = self.dense_layer(num_actions)(
          input_layer, name="fc"
      )
      self.policy_probs = tf.nn.softmax(policy_values, name="policy")
  
      # define the distributions for the policy and the old policy
      # (the + eps is to prevent probability 0 which will cause the log later on to be -inf)
      policy_distribution = tf.contrib.distributions.Categorical(
          probs=(self.policy_probs + eps)
      )
      self.policy_distributions.append(policy_distribution)
      self.output.append(self.policy_probs)
  
file_path: coach/rl_coach/architectures/tensorflow_components/heads/policy_head.py
imports: import numpy
  import tensorflow
  from rl_coach.architectures.tensorflow_components.layers import Dense
  from rl_coach.architectures.tensorflow_components.heads.head import Head, normalized_columns_initializer
  from rl_coach.base_parameters import AgentParameters
  from rl_coach.core_types import ActionProbabilities
  from rl_coach.exploration_policies.continuous_entropy import ContinuousEntropyParameters
  from rl_coach.spaces import DiscreteActionSpace, BoxActionSpace, CompoundActionSpace
  from rl_coach.spaces import SpacesDefinition
  from rl_coach.utils import eps, indent_string
label_desc: Use image node_id 3 for calling the PolicyHead obj's underlying member method code with example usage: obj._build_discrete_net(input_layer, action_space) without return types