具有 3D 卷积层的变分自动编码器交叉熵损失 (xent_loss)
Variational Autoencoder cross-entropy loss (xent_loss) with 3D convolutional layers
我正在调整 VAE 的这个实现 https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py that I found here https://blog.keras.io/building-autoencoders-in-keras.html
此实现不使用卷积层,因此可以说一切都发生在一维中。我的目标是在此模型中实现 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 卷积层的模型,这里已经回答了几乎相同的问题 ,但我无法真正理解如何推断我的案例的答案,因为它具有更复杂的输入形状。
我试过这个解决方案:
xent_loss = original_dim * metrics.binary_crossentropy(K.flatten(x), K.flatten(x_decoded_mean))
但我不知道从数学的角度来看它是否是一个有效的解决方案,虽然现在模型是 运行ning.
您的方法是正确的,但它高度依赖于 K.binary_crossentropy
实施。 tensorflow
和 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,)
现在您正在对每个体素的损失进行平均,并且由于 binary_crossentropy
的每个有效实施都应该适合您。
我正在调整 VAE 的这个实现 https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py that I found here https://blog.keras.io/building-autoencoders-in-keras.html
此实现不使用卷积层,因此可以说一切都发生在一维中。我的目标是在此模型中实现 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 卷积层的模型,这里已经回答了几乎相同的问题
我试过这个解决方案:
xent_loss = original_dim * metrics.binary_crossentropy(K.flatten(x), K.flatten(x_decoded_mean))
但我不知道从数学的角度来看它是否是一个有效的解决方案,虽然现在模型是 运行ning.
您的方法是正确的,但它高度依赖于 K.binary_crossentropy
实施。 tensorflow
和 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,)
现在您正在对每个体素的损失进行平均,并且由于 binary_crossentropy
的每个有效实施都应该适合您。