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

Tik*_*ik0 10 python multipleoutputs deep-learning keras tensorflow

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

Keras 示例模型:

在此处输入图片说明

我的型号:

在此处输入图片说明

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

Val*_*nal 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')
Run Code Online (Sandbox Code Playgroud)

希望它会帮助你。

  • 感谢您的延期!事实上,这是 tf-keras(又名 Tensorflow 2.0)中唯一可行的解​​决方案。 (2认同)

dum*_*kar 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")
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)