def lowerBound(self, x, x_theta, z_mu, z_log_var): #note that we sum the latent dimension and mean over the samples log_px_given_z = self.expectedNegativeReconstructionError( x, x_theta, eps=1e-6).sum(axis=1).mean() KL_qp = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis=1).mean() LL = -KL_qp + log_px_given_z return LL, log_px_given_z, KL_qp
def log_likelihood(z, z_mu, z_log_var, x_mu, x, analytic_kl_term): if analytic_kl_term: kl_term = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis = 1) log_px_given_z = log_bernoulli(x, x_mu, eps = 1e-6).sum(axis = 1) LL = T.mean(-kl_term + log_px_given_z) else: log_qz_given_x = log_normal2(z, z_mu, z_log_var).sum(axis = 1) log_pz = log_stdnormal(z).sum(axis = 1) log_px_given_z = log_bernoulli(x, x_mu, eps = 1e-6).sum(axis = 1) LL = T.mean(log_pz + log_px_given_z - log_qz_given_x) return LL
def latent_gaussian_x_bernoulli(z, z_mu, z_log_var, x, x_mu, analytic_kl_term): """ Latent z : gaussian with standard normal prior decoder output : bernoulli When the output is bernoulli then the output from the decoder should be sigmoid. """ if analytic_kl_term: kl_term = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu).sum(axis=1) LL = T.mean(-kl_term + log_px_given_z) else: log_qz_given_x = log_normal2(z, z_mu, z_log_var).sum(axis=1) log_pz = log_stdnormal(z).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu).sum(axis=1) LL = T.mean(log_pz + log_px_given_z - log_qz_given_x) return LL
def ELBO(z, z_mu, z_log_var, x_mu, x): """ Latent z : gaussian with standard normal prior decoder output : bernoulli When the output is bernoulli then the output from the decoder should be sigmoid. The sizes of the inputs are z: (batch_size, num_latent) z_mu: (batch_size, num_latent) z_log_var: (batch_size, num_latent) x_mu: (batch_size, num_features) x: (batch_size, num_features) """ kl_term = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu, eps=1e-6).sum(axis=1) LL = T.mean(-kl_term + log_px_given_z) return LL
def latent_gaussian_x_bernoulli(z, z_mu, z_log_var, x_mu, x, analytic_kl_term): """ Latent z : gaussian with standard normal prior decoder output : bernoulli When the output is bernoulli then the output from the decoder should be sigmoid. The sizes of the inputs are z: (batch_size, num_latent) z_mu: (batch_size, num_latent) z_log_var: (batch_size, num_latent) x_mu: (batch_size, num_features) x: (batch_size, num_features) """ if analytic_kl_term: kl_term = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu).sum(axis=1) LL = T.mean(-kl_term + log_px_given_z) else: log_qz_given_x = log_normal2(z, z_mu, z_log_var).sum(axis=1) log_pz = log_stdnormal(z).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu).sum(axis=1) LL = T.mean(log_pz + log_px_given_z - log_qz_given_x) return LL
def latent_gaussian_x_bernoulli(z, z_mu, z_log_var, x_mu, x, analytic_kl_term): """ Latent z : gaussian with standard normal prior decoder output : bernoulli When the output is bernoulli then the output from the decoder should be sigmoid. The sizes of the inputs are z: (batch_size, num_latent) z_mu: (batch_size, num_latent) z_log_var: (batch_size, num_latent) x_mu: (batch_size, num_features) x: (batch_size, num_features) """ if analytic_kl_term: kl_term = kl_normal2_stdnormal(z_mu, z_log_var).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu, eps=1e-6).sum(axis=1) LL = T.mean(-kl_term + log_px_given_z) else: log_qz_given_x = log_normal2(z, z_mu, z_log_var).sum(axis=1) log_pz = log_stdnormal(z).sum(axis=1) log_px_given_z = log_bernoulli(x, x_mu, eps=1e-6).sum(axis=1) LL = T.mean(log_pz + log_px_given_z - log_qz_given_x) return LL