在 Keras 中输出 add_loss 添加的多个损失

Output multiple losses added by add_loss in Keras

我研究了 custom loss layer demonstrated by a Variational Autoencoder (VAE) 的 Keras 示例。他们在示例中只有一个损失层,而 VAE 的 objective 由两个不同的部分组成:重建和 KL-Divergence。 但是,我想 plot/visualize 这两个部分在训练过程中如何演变并将单个自定义损失分成两个损失层:

Keras 示例模型:

我的模特:

不幸的是,Keras 在我的多重损失示例中只输出一个损失值,如 my Jupyter Notebook example 中所示,我在其中实现了两种方法。 有人知道如何获得由 add_loss 添加的每次损失值吗? 此外,Keras 如何计算单个损失值,给定多个 add_loss 调用 (Mean/Sum/...?)?

事实证明,答案并不直接,而且 Keras 不支持开箱即用的功能。 但是,我已经实施了一个解决方案,其中每个损失层输出损失,并且自定义回调函数在每个纪元之后记录它。我的多头示例的解决方案可以在这里找到: https://gist.github.com/tik0/7c03ad11580ae0d69c326ac70b88f395

这个确实是不支持的,目前网上不同地方都在讨论。可以通过在编译步骤之后再次将损失作为单独的指标添加来获得解决方案(也讨论 here

这会产生类似这样的结果(专门针对 VAE):

reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))

model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)
model.compile(optimizer='adam')

model.metrics_tensors.append(kl_loss)
model.metrics_names.append("kl_loss")

model.metrics_tensors.append(reconstruction_loss)
model.metrics_names.append("mse_loss")

对我来说,这给出了这样的输出:

Epoch 1/1
252/252 [==============================] - 23s 92ms/step - loss: 0.4336 - kl_loss: 0.0823 - mse_loss: 0.3513 - val_loss: 0.2624 - val_kl_loss: 0.0436 - val_mse_loss: 0.2188

我使用的是 Keras 2.2.4-tf 版本,上面的解决方案对我不起作用。 这是我找到的解决方案(继续 dumkar):

reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))

model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)

model.add_metric(kl_loss, name='kl_loss', aggregation='mean')
model.add_metric(reconstruction_loss, name='mse_loss', aggregation='mean')

model.compile(optimizer='adam')

希望对您有所帮助。