【发布时间】:2018-10-08 08:53:54
【问题描述】:
目前我偶然发现了变分自动编码器,并试图让它们使用 keras 在 MNIST 上工作。我在github上找到了一个教程。
我的问题涉及以下代码行:
# Build model
vae = Model(x, x_decoded_mean)
# Calculate custom loss
xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
vae_loss = K.mean(xent_loss + kl_loss)
# Compile
vae.add_loss(vae_loss)
vae.compile(optimizer='rmsprop')
为什么使用 add_loss 而不是将其指定为编译选项? vae.compile(optimizer='rmsprop', loss=vae_loss) 之类的东西似乎不起作用并引发以下错误:
ValueError: The model cannot be compiled because it has no loss to optimize.
此函数与自定义损失函数有什么区别,我可以将其添加为 Model.fit() 的参数?
提前致谢!
P.S.:我知道 github 上有几个与此相关的问题,但其中大多数是开放的且未注释的。如果问题已经解决,请分享链接!
编辑 1
我删除了将损失添加到模型的行并使用了编译函数的损失参数。现在看起来像这样:
# Build model
vae = Model(x, x_decoded_mean)
# Calculate custom loss
xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
vae_loss = K.mean(xent_loss + kl_loss)
# Compile
vae.compile(optimizer='rmsprop', loss=vae_loss)
这会引发 TypeError:
TypeError: Using a 'tf.Tensor' as a Python 'bool' is not allowed. Use 'if t is not None:' instead of 'if t:' to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
编辑 2
感谢@MarioZ 的努力,我能够找到解决方法。
# Build model
vae = Model(x, x_decoded_mean)
# Calculate custom loss in separate function
def vae_loss(x, x_decoded_mean):
xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
vae_loss = K.mean(xent_loss + kl_loss)
return vae_loss
# Compile
vae.compile(optimizer='rmsprop', loss=vae_loss)
...
vae.fit(x_train,
x_train, # <-- did not need this previously
shuffle=True,
epochs=epochs,
batch_size=batch_size,
validation_data=(x_test, x_test)) # <-- worked with (x_test, None) before
由于某种奇怪的原因,我不得不在拟合模型时明确指定 y 和 y_test。最初,我不需要这样做。生产的样品对我来说似乎是合理的。
虽然我可以解决这个问题,但我仍然不知道这两种方法的区别和缺点是什么(除了需要不同的语法)。谁能给我更多的见解?
【问题讨论】:
-
因为我对此有点挣扎 - 我的 Keras 版本拒绝在没有指定损失的情况下进行编译,解决方案显然是在 compile() 语句中添加 loss=None。
-
原始代码的链接已损坏。我认为this 是原始代码的来源。
标签: neural-network keras autoencoder