10

我研究了变分自动编码器 (VAE) 演示的自定义损失层的 Keras 示例。在示例中它们只有一个损失层,而 VAE 的目标由两个不同的部分组成:重建和 KL-Divergence。但是,我想绘制/可视化这两个部分在训练期间如何演变,并将单个自定义损失分成两个损失层:

Keras 示例模型:

在此处输入图像描述

我的模型:

在此处输入图像描述

不幸的是,Keras 在我的多损失示例中只输出一个损失值,这可以在我的 Jupyter Notebook 示例中看到,我已经实现了这两种方法。有人知道如何获得由 增加的每个损失的值add_loss吗?此外,Keras 如何计算单个损失值,给定多次add_loss调用(均值/总和/...?)?

4

3 回答 3

9

我正在使用 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')

希望它会帮助你。

于 2019-12-16T18:50:22.703 回答
7

这确实不受支持,目前在网络上的不同地方进行了讨论。可以通过在编译步骤之后再次添加损失作为单独的指标来获得解决方案(也在此处讨论)

这会导致类似这样的结果(特别是对于 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
于 2019-03-06T14:34:55.227 回答
1

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

于 2019-01-09T11:53:16.690 回答