Да .. Есть способ, которым вы можете сделать это с помощью небольшой настройки.Обратите внимание, что фреймворки, такие как 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
в пользовательской функции потерь и метриках.
Выше было чисто логично. Чтобы увидеть пример реализации, посмотрите слои ифункция потерь здесь .