【问题标题】:Use TensorFlow loss Global Objectives (recall_at_precision_loss) with Keras (not metrics)将 TensorFlow 损失全局目标 (recall_at_precision_loss) 与 Keras(不是指标)一起使用
【发布时间】:2019-06-14 15:05:11
【问题描述】:

背景

我有 5 个标签的多标签分类问题(例如[1 0 1 1 0])。因此,我希望我的模型在固定召回、精确召回 AUC 或 ROC AUC 等指标上有所改进。

使用与我要优化的性能测量没有直接关系的损失函数(例如binary_crossentropy)是没有意义的。因此,我想使用TensorFlow的global_objectives.recall_at_precision_loss()或类似的损失函数。

非公制

我不是在寻找实现tf.metrics。我已经成功了:https://stackoverflow.com/a/50566908/3399066

问题

我认为我的问题可以分为2个问题:

  1. 如何使用global_objectives.recall_at_precision_loss()或类似的?
  2. 如何在带有 TF 后端的 Keras 模型中使用它?

问题 1

the global objectives GitHub page (same as above) 上有一个名为 loss_layers_example.py 的文件。但是,由于我对 TF 没有太多经验,所以我不太了解如何使用它。此外,谷歌搜索 TensorFlow recall_at_precision_loss exampleTensorFlow Global objectives example 不会给我任何更清楚的例子。

如何在一个简单的 TF 示例中使用global_objectives.recall_at_precision_loss()

问题 2

类似(在 Keras 中):model.compile(loss = ??.recall_at_precision_loss, ...) 就足够了吗? 我的感觉告诉我它比这更复杂,因为使用了loss_layers_example.py 中使用的全局变量。

如何在 Keras 中使用类似于global_objectives.recall_at_precision_loss() 的损失函数?

【问题讨论】:

  • 嗨!我也在尝试将 Global Objectives 的损失函数集成到 Keras 中。您找到解决问题的方法了吗?
  • 我不认为我找到了解决方案,但是使用集成 Keras 的 TensorFlow 2.0 可能会更容易?
  • 原来的链接现在被破坏了,因为 TF 不再维护它了。 New link pointing to archive location

标签: tensorflow keras loss-function auc precision-recall


【解决方案1】:

我设法使它工作:

  • 将张量显式整形为 BATCH_SIZE 长度(参见下面的代码)
  • 将数据集大小缩减为 BATCH_SIZE 的倍数
    def precision_recall_auc_loss(y_true, y_pred):
        y_true = keras.backend.reshape(y_true, (BATCH_SIZE, 1)) 
        y_pred = keras.backend.reshape(y_pred, (BATCH_SIZE, 1))   
        util.get_num_labels = lambda labels : 1
        return loss_layers.precision_recall_auc_loss(y_true, y_pred)[0]

【讨论】:

  • 感谢您的回答。可以提供更多代码,以便人们可以执行一个最小的示例吗?你从哪里调用你的函数precision_recall_auc_loss()util 来自哪个库?你在使用 Keras 和 TensorFlow 2.0 吗?
  • 我今天尝试在 TF2.x 中使用它。不幸的是,loss_layers.precision_recall_auc_loss 由于 TF1.x 使用模式而失败。具体来说,在使用 tf_upgrade_v2 进行自动升级后,我不清楚应该如何处理 model_variable 的使用。但是,升级后的 loss_layers.roc_auc_loss 确实使用了开箱即用的完全相同的模式,并为我的用例提供了改进的结果!
  • 以防万一其他人遇到这种情况。如果您通过 tensorflow.keras 导入 Keras,这不适用于 1.14.x 1.15.x。如果你pip3 install keras=2.2.5 并导入'keras'(不是tensorflow.keras),它就可以工作! (没有尝试过 tf2)
【解决方案2】:

与 Martino 的回答类似,但会根据输入推断形状(将其设置为固定的批量大小对我不起作用)。

外部函数不是绝对必要的,但在配置损失函数时传递参数感觉更自然一些,尤其是当你的包装器定义在外部模块中时。

import keras.backend as K
from global_objectives.loss_layers import precision_at_recall_loss

def get_precision_at_recall_loss(target_recall): 
    def precision_at_recall_loss_wrapper(y_true, y_pred):
        y_true = K.reshape(y_true, (-1, 1)) 
        y_pred = K.reshape(y_pred, (-1, 1))   
        return precision_at_recall_loss(y_true, y_pred, target_recall)[0]
    return precision_at_recall_loss_wrapper

那么,在编译模型的时候:

TARGET_RECALL = 0.9
model.compile(optimizer='adam', loss=get_precision_at_recall_loss(TARGET_RECALL))

【讨论】:

  • 以防万一其他人遇到这种情况。如果您通过 tensorflow.keras 导入 Keras,这不适用于 1.14.x 1.15.x。如果你pip3 install keras=2.2.5 并导入'keras'(不是tensorflow.keras),它就可以工作!
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多