首页 > 解决方案 > Keras,VAE:创建计算每个像素值平均值的自定义损失

问题描述

我正在构建一个变分自动编码器,它将 28x28x1 图像作为输入并生成 28x28x1 图像作为输出,因此每个输入和输出样本都可以表示为具有 784 个条目的向量。我想在自定义损失中添加一个计算每个输入和输出图像中 784 个值的平均值的术语,然后计算这些平均值之间的交叉熵。

我的疑问是我的代码是否正在计算每个输入 - 输出图像的平均值,而不是完整的输入和输出图像集。我作为输入发送的完整数据集具有形状(无、28、28、1)。我希望自定义损失来比较对输入和生成图像的均值。

这是我写的代码:

def vae_loss(self, x, z_decoded):

    x_flat = K.flatten(x)
    z_decoded_flat = K.flatten(z_decoded)

    #usual cross entropy between input and output
    xent_loss = keras.metrics.binary_crossentropy(x_flat, z_decoded_flat)

    #kl divergence
    kl_loss = -5e-4 * K.mean(  
                    1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)

    #cross-entropy between the means
    input = K.mean( K.flatten(x), axis=-1 )
    output = K.mean( K.flatten(z_decoded), axis=-1 )
    xent_means = keras.metrics.binary_crossentropy(input, output)



    return K.mean(xent_loss + kl_loss + xent_means)  

模型的总结是这样的:

编码器

解码器

非常感谢您提前提供任何提示。

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


推荐阅读