输出Keras中add_loss加的多个损失

时间:2019-01-07 06:19:17

标签: python tensorflow keras deep-learning multipleoutputs

我已经研究了custom loss layer demonstrated by a Variational Autoencoder (VAE)的Keras示例。在示例中,它们只有一个损失层,而VAE的目标则由两个不同部分组成:重构和KL分流。 但是,我想绘制/可视化这两个部分在训练过程中的演变过程,并将单个自定义损失分为两个损失层:

Keras示例模型:

enter image description here

我的模型:

enter image description here

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

3 个答案:

答案 0 :(得分:2)

确实不支持此功能,目前在网络上的不同地方对此进行了讨论。可以通过在编译步骤之后将损失作为一个单独的指标再次添加来获得解决方案(也讨论了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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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.add_metric(kl_loss, name='kl_loss', aggregation='mean')
model.add_metric(reconstruction_loss, name='mse_loss', aggregation='mean')

希望它会对您有所帮助。