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

时间:2018-01-14 13:52:52

标签: machine-learning keras autoencoder

我正在调整我在https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py找到的VAE 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

对于具有1D卷积层的模型,这里已经回答了几乎相同的问题Keras - Variational Autoencoder Incompatible shape,但我真的不明白如何推断出具有更复杂输入形状的案例的答案。

我尝试过这个解决方案:

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

但是从数学的角度来看,我不知道它是否是一个有效的解决方案,尽管现在该模型正在运行。

1 个答案:

答案 0 :(得分:1)

您的方法是正确的,但它高度依赖于debuginfo-install java-1.8.0-openjdk 实施。 K.binary_crossentropytensorflow应该适合您(据我所知)。为了使它更干净而不依赖于实现,我建议您采用以下方式:

theano

现在,您正在为每个体素消除损失,并且由于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,) 的每个有效实现都适合您。