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

Python (变分)自动编码器中异常阈值的实用确定,python,tensorflow,threshold,autoencoder,Python,Tensorflow,Threshold,Autoencoder,虽然严格来说这不是一个编程问题,但我在这个网站上还没有找到任何关于这个主题的内容。我目前正在处理(可变)自动编码器((V)AE),并计划部署它们来检测异常。出于测试目的,我在tensorflow中实现了一个用于检测手写数字的VAE 训练进行得很顺利,重建图像与原始图像非常相似。但对于实际使用自动编码器,我必须使用某种度量方法,通过将新图像与阈值进行比较来确定馈送到自动编码器的图像是否为数字 在这一点上,我有两个主要问题: 1.)在培训中,我使用了由两部分组成的损失。第一个是重建误差,它是一个交叉

虽然严格来说这不是一个编程问题,但我在这个网站上还没有找到任何关于这个主题的内容。我目前正在处理(可变)自动编码器((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)
为了确定新图像的重建误差,我必须同时使用训练损失的两部分吗?直觉上,我会说不,然后只使用侦察损失

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

如果你有一些相关的好资料,请分享链接


谢谢

我最近也有类似的问题。VAE能够很好地将高维数据投影到低维潜在空间。改变潜在向量并将其馈送到解码器部分创建新样本

我希望我能正确回答你的问题,你试着在低维潜在空间中用编码器部分进行异常检测

我想你已经在MNIST上训练过你的VAE了。你能做的是得到MNIST数字的所有潜在向量,并通过欧几里得距离将新数字的潜在向量与它们进行比较。阈值将是您设置的最大距离

代码如下所示:

x_mnist_encoded = encoder.predict(x_mnist, batch_size=batch_size) #array of MNIST latent vectors
test_digit_encoded = encoder.predict(x_testdigit, batch_size=1) #your testdigit latent vector

#calc the distance
from scipy.spatial import distance
threshold = 0.3 #min eucledian distance

for vector in x_mnist_encoded:
 dst = distance.euclidean(vector,test_digit_encoded[0])

 if dst <= threshold:
  return True
x_mnist_encoded=encoder.predict(x_mnist,batch_size=batch_size)#mnist潜在向量数组
test_digit_encoded=encoder.predict(x_testdigit,batch_size=1)#您的testdigit潜在向量
#计算距离
从scipy.spatial导入距离
阈值=0.3#最小欧氏距离
对于x_mnist_编码的向量:
dst=距离。欧几里德(向量,测试数字编码[0])

如果dst想把事情弄清楚:我已经在MNIST上训练了我的VAE,现在我想测试它是否能够检测到是否有非数字图像被送入它,例如。G一个“X”。应该以某种方式指出这一点。我认为我使用了编码器和解码器这两个部分,并以某种方式将原始图像与重建图像进行比较。我不知道欧几里德距离是否适用于此。你所描述的是一个简单的二元分类问题。如果你真的想使用VAE模型作为某种无监督模型。你只需要使用编码器部分的潜在向量表示,解码器很酷,可以生成新的数字。另一种分类方法是在MNIST潜在向量上拟合oneclassSVM。好的,这很有意义。但是,将新图像与潜在空间中的所有MNIST数字进行比较,计算成本难道不高吗?另外,假设我的潜在空间是二维的,那么公式会是什么样子?对我来说,总结均值和方差的平方差似乎很奇怪,因为这就像在香蕉上加苹果一样。另外,我发现了一篇有趣的论文。它不使用模型的潜在表示,而是重建其输入,并使用自定义重建概率来评估输入是否异常。这与你的提议相矛盾。你能澄清一下吗@丹尼尔·特雷默
x_mnist_encoded = encoder.predict(x_mnist, batch_size=batch_size) #array of MNIST latent vectors
test_digit_encoded = encoder.predict(x_testdigit, batch_size=1) #your testdigit latent vector

#calc the distance
from scipy.spatial import distance
threshold = 0.3 #min eucledian distance

for vector in x_mnist_encoded:
 dst = distance.euclidean(vector,test_digit_encoded[0])

 if dst <= threshold:
  return True