Python Keras,VAE:创建自定义损耗,计算每个像素值的平均值

Python Keras,VAE:创建自定义损耗,计算每个像素值的平均值,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在构建一个可变自动编码器,它将28x28x1图像作为输入,并生成28x28x1图像作为输出,因此每个输入和输出样本都可以表示为一个包含784个条目的向量。 我想在自定义损失中添加一个项,计算每个输入和输出图像中784个值的平均值,然后计算这些平均值之间的交叉熵 我的疑问是,我的代码是否在计算每一个输入输出图像的平均值,而不是整个输入输出图像集的平均值。我作为输入发送的完整数据集有一个形状(none,28,28,1)。我希望自定义损失比较每个输入图像和生成图像的平均值 这是我写的代码: def

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

我的疑问是,我的代码是否在计算每一个输入输出图像的平均值,而不是整个输入输出图像集的平均值。我作为输入发送的完整数据集有一个形状(none,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)  
该模型的总结如下:


非常感谢您的提示。

您可以在
K.means()
中指定一个
参数,并指定应计算平均值的轴。您好,谢谢@Tinu。我把轴=-1放在K中,意思是()来计算张量的最后一个维度。我想了解的是,Keras在vae_损失中导入的“x”是否只是一个单一的输入样本(28,28,1)(在这种情况下,我认为我编写的代码应该做我期望的事情),或者它是否是完整的训练数据集(无,28,28,1)。如果我没有弄错,损失是在批次上计算的。这里()是另一篇关于自定义丢失函数和批处理的文章。要验证这一点,您可以插入一个简单的
print
语句,告诉您输入的形状。您可以在
K.means()
中指定一个
axis
参数,还可以指定应计算平均值的轴。您好,谢谢@Tinu。我把轴=-1放在K中,意思是()来计算张量的最后一个维度。我想了解的是,Keras在vae_损失中导入的“x”是否只是一个单一的输入样本(28,28,1)(在这种情况下,我认为我编写的代码应该做我期望的事情),或者它是否是完整的训练数据集(无,28,28,1)。如果我没有弄错,损失是在批次上计算的。这里()是另一篇关于自定义丢失函数和批处理的文章。为了验证这一点,您可以插入一个简单的
print
语句,告诉您输入的形状。