как рассчитать вероятность реконструкции для обнаружения аномалии VAE - PullRequest
0 голосов
/ 06 августа 2020

Я реализую вероятность реконструкции VAE в статье «Обнаружение аномалий на основе вариационного автокодера с использованием вероятности реконструкции». Но у меня возникла проблема с формой mean_x 'и sigma_x' для многомерного нормального распределения.

logi c вероятности восстановления:

  1. введите x в Encoder, получите среднее значение (mu_z) и дисперсия (sigma_z) скрытого вектора;
  2. взять L отсчет из mu_z и sigma_z;
  3. ввести эти L отсчетов в декодер, получить среднее (mu_x ') и дисперсия (sigma_x ') сгенерированного x';
  4. вычислить логарифмическую вероятность x в многомерном нормальном распределении с mu_z 'и sigma_x';

Вероятность реконструкции

Насколько я знаю, форма mu_x 'и sigma_x' одинакова при выводе из декодера и должна быть (sequence_length, batch_size, num_of_features), как (240,32,1). Чтобы вычислить многомерное нормальное распределение log_probability, мы должны ввести эти два параметра в распределение, но в качестве параметра распределения ковариационная матрица не должна иметь ту же форму, что и среднее значение. Итак, как мне преобразовать sigma_x 'и ввести его в функцию MultivariateNormal? Вот мой код. «Строка # Проблемы» - это строка с проблемой.

reconstructed_prob = np.zeros((len(dataset),), dtype='float32')

test_loader = DataLoader(dataset=dataset,
                         batch_size=self.batch_size,
                         shuffle=False,
                         drop_last=True)  
if self.is_fitted:
    with torch.no_grad():
        for t, x in enumerate(test_loader):  #t=0, x.shape(32,240,1)
            x = x[0]
            x = x.permute(1, 0, 2) #(240,32,1)
            x = Variable(x[:, :, :].type(self.dtype), requires_grad=True) 
            _, _, cell_output = self.encoder(x)  # h_hidden, (batch_size,units) (32,90)
            latent_mean, latent_logvar = self.lmbd(cell_output)  # input: last hidden state of encoder return: latent vector(batch_size32, z_dims5)

            score = 0
            for _ in range(L):

                # Sample a random c and z vector and reparametrize
                # epsilon_c = torch.randn(net.batch_size, net.T, net.z_dim)
                epsilon_z = torch.randn_like(latent_mean)

                if torch.cuda.is_available():
                    # epsilon_c = epsilon_c.to(torch.device(0))
                    epsilon_z = epsilon_z.to(torch.device(0))

                # c = mu_c + epsilon_c * sigma_c
                z = epsilon_z.mul(latent_logvar).add_(latent_mean)  #(32,5)

                # Pass sample through decoder and calculate reconstruction prob
                mu_x, sigma_x = self.decoder(z) # (240,32,1)
                pdf = torch.distributions.multivariate_normal.MultivariateNormal(mu_x,sigma_x)  #problem line
                score += pdf.log_prob(x)
                p_l = multivariate_normal.pdf(x, mu_x, sigma_x)
            reconstructed_prob[t] = score/L
...