Используйте TensorFlow loss Global Objectives (rev_at_precision_loss) с Keras (не метриками) - PullRequest
0 голосов
/ 21 января 2019

Фон

У меня проблема классификации по нескольким меткам с 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. Как использовать его в модели Keras с бэкэндом TF?

Задача 1

Существует файл с именем loss_layers_example.py на Страница глобальных целей GitHub (такая же, как указано выше) .Однако, поскольку у меня нет большого опыта работы с TF, я не очень понимаю, как его использовать.Кроме того, поиск в Google для TensorFlow recall_at_precision_loss example или TensorFlow Global objectives example не даст мне более ясного примера.

Как мне использовать global_objectives.recall_at_precision_loss() в простом примере TF?

Задача 2

Будет ли что-то вроде (в Керасе): model.compile(loss = ??.recall_at_precision_loss, ...) будет достаточно?Мое чувство говорит мне, что это более сложно, чем это, из-за использования глобальных переменных, используемых в loss_layers_example.py.

Как использовать функции потерь, подобные global_objectives.recall_at_precision_loss() в Керасе?

Ответы [ 2 ]

0 голосов
/ 15 августа 2019

Аналогично ответу Мартино, но будет выводить форму из ввода (установка фиксированного размера пакета для меня не сработала).

Внешняя функция не является строго необходимой, но она кажется немного болееЕстественно передавать параметры при настройке функции потерь, особенно когда ваша оболочка определена во внешнем модуле.

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))
0 голосов
/ 27 июня 2019

Мне удалось заставить это работать:1007 *

    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]
...