【问题标题】:Output multiple losses added by add_loss in Keras输出 Keras 中 add_loss 添加的多个损失
【发布时间】:2019-01-07 06:19:16
【问题描述】:

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

Keras 示例模型:

我的模特:

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

【问题讨论】:

    标签: python tensorflow keras deep-learning multipleoutputs


    【解决方案1】:

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

    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')
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的扩展!事实上,这是 tf-keras(又名 tensorflow 2.0)中唯一可行的解​​决方案。
    • 我已经在此处实现了您为标准 VAE Keras 示例提出的解决方案,仅供参考:gist.github.com/tik0/6aa42cabb9cf9e21567c3deb309107b7
    • @ValentinVIGNAL 谢谢你的回答。你能告诉我(好奇并想学习)你是如何理解/想到将聚合 ='mean' 参数传递给 add_metric 的吗?我看不到任何使用除函数名称参数以外的示例。有 **kwargs 但不确定它们指的是什么。
    • 使用更新版本的 TF (2.2.0),你需要在 model.add_metric 调用之后移动 model.compile 调用,否则你会得到一个 TypeError: unhashable type: 'DictWrapper' 错误(我已经提出这个作为对这篇文章的编辑)。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-08-04
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2019-06-19
        • 2019-01-11
        • 1970-01-01
        相关资源
        最近更新 更多