虽然不是严格意义上的编程问题,但我在本网站上没有找到关于此主题的任何内容。我目前处理(变分)自动编码器((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功能?
如果您有任何相关信息,请分享链接!
谢谢!
答案 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