def __init__(self, x_dim, h_dim, t_dim): super(VAE_BKDG, self).__init__() self.x_dim = x_dim self.h_dim = h_dim self.t_dim = t_dim d_dim = int(x_dim/t_dim) self.d_dim = d_dim l_dim = int(d_dim * (d_dim+1)/2) self.l_dim = l_dim z_dim = t_dim * l_dim self.z_dim = z_dim # feature self.fc0 = nn.Linear(x_dim, h_dim) self.fc1 = nn.Linear(h_dim, h_dim) # encode self.fc21 = nn.Linear(h_dim, z_dim) self.fc22 = nn.Linear(h_dim, int(t_dim*(t_dim+1)/2)) # transform self.fc2 = nn.Linear(z_dim, h_dim) self.fc3 = nn.Linear(h_dim, h_dim) # decode self.fc41 = nn.Linear(h_dim, x_dim) self.fc42 = nn.Linear(h_dim, x_dim) self.relu = nn.ReLU() self.sigmoid = nn.Sigmoid() self.tanh = nn.Tanh() t = torch.linspace(0,2,steps=t_dim+1); t = t[1:] self.K = Variable(torch.exp(-torch.pow(t.unsqueeze(1)-t.unsqueeze(0),2)/2/2) + 1e-4*torch.eye(t_dim)) self.Kh = torch.potrf(self.K) self.iK = torch.potri(self.Kh)
def __init__(self, x_dim, h_dim, z_dim): super(VAE, self).__init__() self.x_dim = x_dim # ND self.h_dim = h_dim self.z_dim = z_dim # ND^* self.t_dim = np.int(x_dim / (2 * z_dim / x_dim - 1)) # N # feature self.fc0 = nn.Linear(x_dim, h_dim) # encode self.fc21 = nn.Linear(h_dim, z_dim) self.fc22 = nn.Linear(h_dim, np.int(self.t_dim * (self.t_dim + 1) / 2)) # self.fc23 = nn.Linear(h_dim, z_dim) # transform self.fc3 = nn.Linear(z_dim, h_dim) # decode self.fc41 = nn.Linear(h_dim, x_dim) self.fc42 = nn.Linear(h_dim, x_dim) self.relu = nn.ReLU() self.sigmoid = nn.Sigmoid() self.tanh = nn.Tanh() # problem-specific parameters self.D = np.int(self.z_dim / self.x_dim * 2 - 1) self.N = np.int(self.x_dim / self.D) # GP kernel t = torch.linspace(0, 2, steps=self.N + 1) t = t[1:] self.K = Variable( torch.exp(-torch.pow(t.unsqueeze(1) - t.unsqueeze(0), 2) / 2 / 2) + 1e-4 * torch.eye(self.N)) self.Kh = torch.potrf(self.K) # self.iK = Variable(torch.inverse(self.K.data)) self.iK = torch.potri(self.Kh)
def __init__(self, x_dim, h_dim, t_dim): super(VGP, self).__init__() self.x_dim = x_dim self.h_dim = h_dim self.t_dim = t_dim d_dim = int(x_dim / t_dim) self.d_dim = d_dim d2h_dim = int(d_dim * (d_dim + 1) / 2) self.d2h_dim = d2h_dim z_dim = t_dim * d2h_dim self.z_dim = z_dim # source-target dimensions of GP draws f_in = 20 self.f_in = f_in f_out = 100 self.f_out = f_out # encode 1: x -> s,t (variational data) self.fc1 = nn.Linear(x_dim, h_dim) self.fc11 = nn.Linear(h_dim, f_in) self.fc12 = nn.Linear(h_dim, f_out) # encode 2: f -> z self.fc2 = nn.Linear(f_out, h_dim) self.fc21 = nn.Linear(h_dim, z_dim) self.fc22 = nn.Linear(h_dim, int(t_dim * (t_dim + 1) / 2)) # encode 3: x, z -> r self.fc3 = nn.Linear(x_dim + z_dim, h_dim) self.fc31 = nn.Linear(h_dim, f_in + f_out) self.fc32 = nn.Linear(h_dim, f_in + f_out) # decode: z -> x self.fc4 = nn.Linear(z_dim, h_dim) self.fc41 = nn.Linear(h_dim, x_dim) self.fc42 = nn.Linear(h_dim, x_dim) self.relu = nn.ReLU() self.sigmoid = nn.Sigmoid() self.tanh = nn.Tanh() # GP kernel t = torch.linspace(0, 2, steps=t_dim + 1) t = t[1:] self.K = Variable( torch.exp(-torch.pow(t.unsqueeze(1) - t.unsqueeze(0), 2) / 2 / 2) + 1e-4 * torch.eye(t_dim)) self.Kh = torch.potrf(self.K) # self.iK = Variable(torch.inverse(self.K.data)) self.iK = torch.potri(self.Kh)
def estep(self, data): """ Compute log observation probabilities under GMM. Args: data: N x D tensor of points Returns: logobs: N x K tensor of log probabilities (for each point on each cluster) """ # Constants N, D = data.shape K = self._sigma.shape[0] logobs = -0.5 * ptu.ones((N, K)) * D * np.log(2*np.pi) # Constant for i in range(K): mu, sigma = self._mu[i], self._sigma[i] L = torch.potri(sigma, upper=False) # Cholesky decomposition logobs[:, i] -= torch.sum(torch.log(torch.))
def potri_compat(var): return Variable(torch.potri( var.data)) if torch.__version__ < '0.3.0' else torch.potri(var)
def psd_inv(mat): u = T.cholesky(mat, upper=False) return T.potri(u, upper=False)
def _get_precision(self): if self._l is None: self._get_chol() self._precision = Variable(torch.potri(self._l.data))