Как использовать метрику с тремя входами (метрика GAP) в Керасе во время тренировки? - PullRequest
0 голосов
/ 21 мая 2019

Это код метрики GAP из kaggle

def GAP(pred, conf, true):
    x = pd.DataFrame({'pred': pred, 'conf': conf, 'true': true})
    x.sort_values('conf', ascending=False, inplace=True, na_position='last')
    x['correct'] = (x.true == x.pred).astype(int)
    x['prec_k'] = x.correct.cumsum() / (np.arange(len(x)) + 1)
    x['term'] = x.prec_k * x.correct
    gap = x.term.sum() / x.true.count()

    return gap

Я хочу использовать его во время обучения, но он получает conf аргумент - вектор вероятности или доверительных оценок для прогнозирования.Но метрика должна получить только два аргумента.Есть ли возможность использовать его так:

model.compile(loss='my_loss',metrics=[GAP]) 

1 Ответ

0 голосов
/ 25 мая 2019

Да .. Есть способ, которым вы можете сделать это с помощью небольшой настройки.Обратите внимание, что фреймворки, такие как Keras, поддерживают функции потерь и метрики вида fun(true, pred).Определение функции должно быть только в этой форме.

Кроме того, второе ограничение заключается в том, что формы как true, так и pred должны быть одинаковыми.

Настройка первого ограничения: Конкатенациядва выходных тензора в один.Предположим, у вас есть x количество выходных классов, тогда форма conf и pred будет (None, x).Вы можете объединить эти два тензора в один и получить final_output с формой (None, 2, x).

. Это только первый шаг.Это не сработает, если мы не настроим второе ограничение.

Теперь давайте настроим второе ограничение: это ограничение можно сократить до: «Размеры обоих этих тензоров должны быть одинаковыми».Обратите внимание, что я пытаюсь уменьшить ограничение от формы до размеров.Это можно сделать с помощью динамических фигур, например: shape(true) = (None, 1, x) and shape(pred) = (None, None, x) не будет выдавать ошибки, поскольку None может принимать любое значение во время выполнения.Короче говоря, добавьте слой в конце модели, чтобы объединить выходные данные, и этот слой должен иметь динамическую выходную форму.

Но в вашем случае true также будет иметь форму (None, x).Вы можете просто развернуть измерения этого тензора в axis=1, чтобы получить (None, 1, x), и тогда вновь сгенерированное значение true может быть предоставлено в качестве входных данных для модели.

Обратите внимание, что при комбинировании two тензоры, final_output всегда будет иметь форму (None, 2, x), которая не равна (None, 1, x).Но так как мы настроили последний слой для возврата динамической формы, то есть (None, None, x), это не будет проблемой во время компиляции.И Keras никогда не проверяет несоответствие форм во время выполнения , за исключением того, что операция над тензором вызывает эту ошибку .

Теперь, когда у вас есть final_output с той же формой, что и true, вам просто нужнонарезать final_output, чтобы получить исходные два тензора pred и conf в пользовательской функции потерь и метриках.

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

...