虽然严格来说不是一个编程问题,但我在这个网站上没有找到任何关于这个主题的内容。我目前正在处理(变分(自动编码器((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-散度,它是两个概率分布相似程度的度量,因为我们要求潜在变量空间是类似于高斯的分布。
# 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 功能?
如果您有任何相关内容的良好来源,请分享链接!
谢谢!
我最近遇到了类似的问题。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
VAE代码来自 https://blog.keras.io/building-autoencoders-in-keras.html