Я реализую вероятность реконструкции VAE в статье «Обнаружение аномалий на основе вариационного автокодера с использованием вероятности реконструкции». Но у меня возникла проблема с формой mean_x 'и sigma_x' для многомерного нормального распределения.
logi c вероятности восстановления:
- введите x в Encoder, получите среднее значение (mu_z) и дисперсия (sigma_z) скрытого вектора;
- взять L отсчет из mu_z и sigma_z;
- ввести эти L отсчетов в декодер, получить среднее (mu_x ') и дисперсия (sigma_x ') сгенерированного x';
- вычислить логарифмическую вероятность 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