|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Basic data management and plotting utilities.""" |
|
|
|
from __future__ import absolute_import |
|
from __future__ import division |
|
from __future__ import print_function |
|
|
|
import os |
|
import cPickle as pickle |
|
import getpass |
|
import numpy as np |
|
import gc |
|
import tensorflow as tf |
|
|
|
|
|
|
|
|
|
def exp_moving_average(x, alpha=0.9): |
|
res = [] |
|
mu = 0 |
|
alpha_factor = 1 |
|
for x_i in x: |
|
mu += (1 - alpha)*(x_i - mu) |
|
alpha_factor *= alpha |
|
res.append(mu/(1 - alpha_factor)) |
|
|
|
return np.array(res) |
|
|
|
def sanitize(s): |
|
return s.replace('.', '_') |
|
|
|
|
|
|
|
|
|
def softplus(x): |
|
''' |
|
Let m = max(0, x), then, |
|
|
|
sofplus(x) = log(1 + e(x)) = log(e(0) + e(x)) = log(e(m)(e(-m) + e(x-m))) |
|
= m + log(e(-m) + e(x - m)) |
|
|
|
The term inside of the log is guaranteed to be between 1 and 2. |
|
''' |
|
m = tf.maximum(tf.zeros_like(x), x) |
|
return m + tf.log(tf.exp(-m) + tf.exp(x - m)) |
|
|
|
def safe_log_prob(x, eps=1e-8): |
|
return tf.log(tf.clip_by_value(x, eps, 1.0)) |
|
|
|
def rms(x): |
|
return tf.sqrt(tf.reduce_mean(tf.square(x))) |
|
|
|
def center(x): |
|
mu = (tf.reduce_sum(x) - x)/tf.to_float(tf.shape(x)[0] - 1) |
|
return x - mu |
|
|
|
def vectorize(grads_and_vars, set_none_to_zero=False, skip_none=False): |
|
if set_none_to_zero: |
|
return tf.concat([tf.reshape(g, [-1]) if g is not None else |
|
tf.reshape(tf.zeros_like(v), [-1]) for g, v in grads_and_vars], 0) |
|
elif skip_none: |
|
return tf.concat([tf.reshape(g, [-1]) for g, v in grads_and_vars if g is not None], 0) |
|
else: |
|
return tf.concat([tf.reshape(g, [-1]) for g, v in grads_and_vars], 0) |
|
|
|
def add_grads_and_vars(a, b): |
|
'''Add grads_and_vars from two calls to tf.compute_gradients.''' |
|
res = [] |
|
for (g_a, v_a), (g_b, v_b) in zip(a, b): |
|
assert v_a == v_b |
|
if g_a is None: |
|
res.append((g_b, v_b)) |
|
elif g_b is None: |
|
res.append((g_a, v_a)) |
|
else: |
|
res.append((g_a + g_b, v_a)) |
|
return res |
|
|
|
def binary_log_likelihood(y, log_y_hat): |
|
"""Computes binary log likelihood. |
|
|
|
Args: |
|
y: observed data |
|
log_y_hat: parameters of the binary variables |
|
|
|
Returns: |
|
log_likelihood |
|
""" |
|
return tf.reduce_sum(y*(-softplus(-log_y_hat)) + |
|
(1 - y)*(-log_y_hat-softplus(-log_y_hat)), |
|
1) |
|
|
|
def cov(a, b): |
|
"""Compute the sample covariance between two vectors.""" |
|
mu_a = tf.reduce_mean(a) |
|
mu_b = tf.reduce_mean(b) |
|
n = tf.to_float(tf.shape(a)[0]) |
|
|
|
return tf.reduce_sum((a - mu_a)*(b - mu_b))/(n - 1.0) |
|
|
|
def corr(a, b): |
|
return cov(a, b)*tf.rsqrt(cov(a, a))*tf.rsqrt(cov(b, b)) |
|
|
|
def logSumExp(t, axis=0, keep_dims = False): |
|
'''Computes the log(sum(exp(t))) numerically stabily. |
|
|
|
Args: |
|
t: input tensor |
|
axis: which axis to sum over |
|
keep_dims: whether to keep the dim or not |
|
|
|
Returns: |
|
tensor with result |
|
|
|
''' |
|
m = tf.reduce_max(t, [axis]) |
|
res = m + tf.log(tf.reduce_sum(tf.exp(t - tf.expand_dims(m, axis)), [axis])) |
|
|
|
if keep_dims: |
|
return tf.expand_dims(res, axis) |
|
else: |
|
return res |
|
|