我对NN和tensorflow非常陌生,最近我一直在阅读变分自动编码器的keras实现,我发现了损失函数的两个版本:
version1:
def vae_loss(x, x_decoded_mean):
recon_loss = original_dim * objectives.mse(x, x_decoded_mean)
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
return recon_loss + kl_loss
version2:
def vae_loss(x, x_decoded_mean):
recon_loss = objectives.mse(x, x_decoded_mean)
kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
return recon_loss + kl_loss
如果我的理解是正确的,那么版本1是损失的总和,版本2是同一批次中所有样品的平均损失。那么损失的规模会影响学习结果吗?我试着测试它们,这在很大程度上影响了我的潜在变量量表。那么,为什么会这样,哪种形式的损失函数是正确的呢
更新我的问题: 如果我用KL损失乘以原始值
def vae_loss(x, x_decoded_mean):
xent_loss = original_dim * objectives.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) *original_dim
return xent_loss + kl_loss
潜在分布如下所示: enter image description here
解码后的输出如下所示: enter image description here
看起来编码器输出不包含任何信息。我使用的是mnist数据集和来自https://github.com/vvkv/Variational-Auto-Encoders/blob/master/Variational%2BAuto%2BEncoders.ipynb的示例
对一批中每个示例的损失求和与平均值的比较将简单地按比例缩放所有损失项。同样的变化是调整学习率。重要的是,你的正常损失量乘以你的学习率不会导致学习不稳定
相关问题 更多 >
编程相关推荐