code: def feed_forward_gaussian_fun(action_space, config, observations):
    
    if not isinstance(action_space, gym.spaces.box.Box):
      raise ValueError("Expecting continuous action space.")
  
    mean_weights_initializer = tf.initializers.variance_scaling(
        scale=config.init_mean_factor)
    logstd_initializer = tf.random_normal_initializer(config.init_logstd, 1e-10)
  
    flat_observations = tf.reshape(observations, [
        tf.shape(observations)[0], tf.shape(observations)[1],
        functools.reduce(operator.mul, observations.shape.as_list()[2:], 1)])
  
    with tf.variable_scope("network_parameters"):
      with tf.variable_scope("policy"):
        x = flat_observations
        for size in config.policy_layers:
          x = tf.layers.dense(x, size, activation=tf.nn.relu)
        mean = tf.layers.dense(
            x, action_space.shape[0], activation=tf.tanh,
            kernel_initializer=mean_weights_initializer)
        logstd = tf.get_variable(
            "logstd", mean.shape[2:], tf.float32, logstd_initializer)
        logstd = tf.tile(
            logstd[None, None],
            [tf.shape(mean)[0], tf.shape(mean)[1]] + [1] * (mean.shape.ndims - 2))
      with tf.variable_scope("value"):
        x = flat_observations
        for size in config.value_layers:
          x = tf.layers.dense(x, size, activation=tf.nn.relu)
        value = tf.layers.dense(x, 1)[..., 0]
    mean = tf.check_numerics(mean, "mean")
    logstd = tf.check_numerics(logstd, "logstd")
    value = tf.check_numerics(value, "value")
  
    policy = tfp.distributions.MultivariateNormalDiag(mean, tf.exp(logstd))
  
    return NetworkOutput(policy, value, lambda a: tf.clip_by_value(a, -2., 2))
docs: Feed-forward Gaussian.