def log_conditional_prob(self, x): # E_{Q(h|x)} log Q(h|x) h_mu, h_logvar = self.inference(x) h = sample_from_gaussian(h_mu, h_logvar) logp_h_given_x = tf.reduce_sum( -0.5 * np.log(2 * np.pi) - 0.5 * h_logvar - 0.5 * tf.square(h - h_mu) / tf.exp(h_logvar), axis=-1) return logp_h_given_x, h
def get_independent_means(self, num_samples, burn_in_steps=100000, random=True): v = tf.zeros([num_samples, self.vis_dim], dtype=tf.float32) if random: v = sample_from_gaussian(v, 2. * tf.log(self.sigma)) + self.vis_b for i in xrange(burn_in_steps): _, v = self.gibbs_vhv(v) h_1 = sample_from_bernoulli(self.vis2hid(v)) v_1 = self.hid2vis(h_1) return v_1.numpy()
def get_independent_samples(self, num_samples, burn_in_steps=100000, random=True, initial_v=None): if initial_v is not None: v = initial_v else: v = tf.zeros([num_samples, self.vis_dim], dtype=tf.float32) + self.vis_b if random: v = sample_from_gaussian(v, 2. * tf.log(self.sigma)) for i in xrange(burn_in_steps): _, v = self.gibbs_vhv(v) return v.numpy()
def get_samples_single_chain(self, num_samples, adjacent_samples=10, steps_between_samples=1000, burn_in_steps=100000, random=True): assert num_samples % adjacent_samples == 0 v = tf.zeros([1, self.vis_dim], dtype=tf.float32) + self.vis_b if random: v = sample_from_gaussian(v, 2. * tf.log(self.sigma)) for i in xrange(burn_in_steps): _, v = self.gibbs_vhv(v) sample_list = [] for i in xrange(num_samples / adjacent_samples): for j in xrange(adjacent_samples): _, v = self.gibbs_vhv(v) sample_list.append(v.numpy()) for i in xrange(steps_between_samples): _, v = self.gibbs_vhv(v) return np.vstack(sample_list)
def get_h(self, x): h_mu, h_logvar = self.inference(x) h = sample_from_gaussian(h_mu, h_logvar) return h
def gibbs_hvh(self, h_0): v_1 = sample_from_gaussian(self.hid2vis(h_0), 2 * tf.log(self.sigma)) v_1 = tf.stop_gradient(v_1) h_1 = sample_from_bernoulli(self.vis2hid(v_1)) return v_1, h_1
def gibbs_vhv(self, v_0): h_1 = sample_from_bernoulli(self.vis2hid(v_0)) v_1 = sample_from_gaussian(self.hid2vis(h_1), 2 * tf.log(self.sigma)) v_1 = tf.stop_gradient(v_1) return h_1, v_1