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



我正在调整我在这里找到的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 - 变分自动编码器 具有 1D 卷积层的模型的形状不兼容,但我真的无法真正理解如何推断我的情况的答案 wjich 具有更复杂的输入形状。

我尝试过这个解决方案:

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实现都应该适合您。

相关内容

  • 没有找到相关文章

最新更新