def v_from_u(u, log_alpha, force_same=True, b=None, v_prime=None):
u_prime = tf.nn.sigmoid(-log_alpha)
if not force_same:
v = b*(u_prime+v_prime*(1-u_prime)) + (1-b)*v_prime*u_prime
else:
v_1 = (u - u_prime) / safe_clip(1 - u_prime)
v_1 = tf.clip_by_value(v_1, 0, 1)
v_1 = tf.stop_gradient(v_1)
v_1 = v_1 * (1 - u_prime) + u_prime
v_0 = u / safe_clip(u_prime)
v_0 = tf.clip_by_value(v_0, 0, 1)
v_0 = tf.stop_gradient(v_0)
v_0 = v_0 * u_prime
v = tf.where(u > u_prime, v_1, v_0)
v = tf.check_numerics(v, 'v sampling is not numerically stable.')
if force_same:
v = v + tf.stop_gradient(-v + u) # v and u are the same up to numerical errors
return v
评论列表
文章目录