in safe_rl/pg/network.py [0:0]
def mlp_squashed_gaussian_policy(x, a, hidden_sizes, activation, output_activation, action_space):
"""
Experimental code for squashed gaussian policies, not yet tested
"""
act_dim = a.shape.as_list()[-1]
net = mlp(x, list(hidden_sizes), activation, activation)
mu = tf.layers.dense(net, act_dim, activation=output_activation)
log_std = tf.layers.dense(net, act_dim, activation=None)
log_std = tf.clip_by_value(log_std, LOG_STD_MIN, LOG_STD_MAX)
std = tf.exp(log_std)
u = mu + tf.random_normal(tf.shape(mu)) * std
pi = tf.tanh(u)
old_mu_ph, old_log_std_ph, u_ph = placeholders(act_dim, act_dim, act_dim)
d_kl = gaussian_kl(mu, log_std, old_mu_ph, old_log_std_ph) # kl is invariant to squashing transform
def apply_squashing_func(log_prob, raw_action):
# Adjustment to log prob
act = tf.tanh(raw_action)
log_prob -= tf.reduce_sum(2*(np.log(2) - act - tf.nn.softplus(-2*act)), axis=1)
return log_prob
# Base log probs
logp = gaussian_likelihood(u_ph, mu, log_std)
logp_pi = gaussian_likelihood(u, mu, log_std)
# Squashed log probs
logp = apply_squashing_func(logp, u_ph)
logp_pi = apply_squashing_func(logp_pi, u)
# Approximate entropy
ent = -tf.reduce_mean(logp_pi) # approximate! hacky!
pi_info = {'mu': mu, 'log_std': log_std, 'raw_action': u}
pi_info_phs = {'mu': old_mu_ph, 'log_std': old_log_std_ph, 'raw_action': u_ph}
return pi, logp, logp_pi, pi_info, pi_info_phs, d_kl, ent