(变分)自动编码器中异常阈值的实际确定

时间:2018-05-29 09:35:18

标签: python tensorflow threshold autoencoder

虽然不是严格意义上的编程问题,但我在本网站上没有找到关于此主题的任何内容。我目前处理(变分)自动编码器((V)AE),并计划部署它们以检测异常。出于测试目的,我在tensorflow中实现了一个用于检测手写数字的VAE。

训练顺利,重建的图像与原件非常相似。但是对于实际使用自动编码器,我必须使用某种度量来确定馈送到自动编码器的新图像是否是数字,通过将其与阈值进行比较。

此时,我有两个主要问题:

1。)对于培训,我使用了由两个组成部分组成的损失。第一个是重建误差,它是一个交叉熵函数:

# x: actual input
# x_hat: reconstructed input
epsilon = 1e-10  # <-- small number for numeric stability within log
recons_loss = - f.reduce_sum( x * tf.log( epsilon + x_hat) + (1 - x) * tf.log( epsilon + 1 - x_hat),
                             axis=1)

第二个是KL-divergence,它衡量两个概率分布的相似程度,因为我们要求潜在变量空间是一个类似于高斯分布的分布。

# z_mean: vector representing the means of the latent distribution
# z_log_var: vector representing the variances of the latent distribution
KL_div = -0.5 * tf.reduce_sum( 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var),
                              axis=1)

为了确定新图像的重建错误,我是否必须使用训练损失的两个部分?直观地说,我会说不,只需使用recon_loss。

2。)如何确定阈值?是否已经实现了我可以使用的tf功能?

如果您有任何相关信息,请分享链接!

谢谢!

1 个答案:

答案 0 :(得分:0)

我最近遇到了类似的问题。 VAE很好地将高维数据投影到较低维度的潜在空间中。改变潜在的矢量并将其馈送到解码器部分会产生新的样本。

我希望我的问题是正确的,您是否尝试使用较低维潜在空间上的编码器部分进行异常检测?

我猜你已经在MNIST上训练了你的VAE。您可以做的是获取MNIST数字的所有潜在向量,并通过欧几里德距离比较新数字的潜在向量。阈值将是您设置的最大距离。

代码将是这样的:

chatClient.getUserChannelDescriptors().then(function(paginator) {
  for (i=0; i<paginator.items.length; i++) {
    var channel = paginator.items[i];
    console.log('Channel: ' + channel.friendlyName);
  }
});    

VAE代码来自https://blog.keras.io/building-autoencoders-in-keras.html