code: def __str__(self):
      action_head_mean_result = []
      if isinstance(self.spaces.action, DiscreteActionSpace):
          # create a discrete action network (softmax probabilities output)
          action_head_mean_result.append(
              "Dense (num outputs = {})".format(
                  len(self.spaces.action.actions)
              )
          )
          action_head_mean_result.append("Softmax")
      elif isinstance(self.spaces.action, BoxActionSpace):
          # create a continuous action network (bounded mean and stdev outputs)
          action_head_mean_result.append(
              "Dense (num outputs = {})".format(
                  self.spaces.action.shape
              )
          )
  
      return "\n".join(action_head_mean_result)
  
file_path: coach/rl_coach/architectures/tensorflow_components/heads/ppo_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, DistributedTaskParameters
  from rl_coach.core_types import ActionProbabilities
  from rl_coach.spaces import BoxActionSpace, DiscreteActionSpace
  from rl_coach.spaces import SpacesDefinition
  from rl_coach.utils import eps
label_desc: Use image node_id 5 for calling the PPOHead obj's underlying member method code with example usage: obj.__str__() and returns: str