变分自编码器的交叉熵损失(xent_loss)与3D卷积层

我正在调整这里找到的VAE实现 https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py,该实现来自 https://blog.keras.io/building-autoencoders-in-keras.html

这个实现没有使用卷积层,所以可以说一切都在1D中进行。我的目标是在这个模型中实现3D卷积层。

然而,在运行批次(每个批次有128个样本)时,我在损失函数处遇到了形状不匹配的问题:

def vae_loss(self, x, x_decoded_mean):    xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)    #xent_loss.shape >> [128, 40, 20, 40, 1]    kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)    #kl_loss.shape >> [128]    return K.mean(xent_loss + kl_loss) # >> error shape mismatch

几乎相同的问题在这里已经得到了解答 Keras – Variational Autoencoder Incompatible shape,针对的是使用1D卷积层的模型,但我无法理解如何将答案推广到我的情况,我的输入形状更为复杂。

我尝试了这个解决方案:

xent_loss = original_dim * metrics.binary_crossentropy(K.flatten(x), K.flatten(x_decoded_mean))

虽然现在模型可以运行,但我不知道从数学角度来看这是否是一个有效的解决方案。


回答:

你的方法是正确的,但它高度依赖于 K.binary_crossentropy 的实现。根据我的了解,tensorflowtheano 的实现应该对你有效。为了使其更加清晰且不依赖于具体实现,我建议你采用以下方法:

xent_loss_vec = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)xent_loss = K.mean(xent_loss_vec, axis=[1, 2, 3, 4])# xent_loss.shape = (128,)

现在,你是对每个体素的损失取平均值,这样任何有效的 binary_crossentropy 实现都应该能正常工作。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注