Во-первых, позвольте мне сделать несколько замечаний о числовой стабильности:
Как упоминалось в разделе комментариев, числовая нестабильность в случае использования from_logits=False
возникает из преобразования значений вероятности обратно в логиты, что включает операция отсечения (как обсуждалось в этого вопроса и его ответа ). Однако, насколько мне известно, это НЕ создает серьезных проблем для практических приложений .
Другими словами, если вас не интересует точность генерируемые значения вероятности с чувствительностью около [-1e-7, 1e-7]
(или связанная с этим проблема сходимости, наблюдаемая в ваших экспериментах), тогда вам не стоит слишком беспокоиться; просто используйте сигмоидальную и двоичную кросс-энтропию, как и раньше, то есть model.compile(loss='binary_crossentropy', ...)
, и она будет работать нормально.
В общем, если вы действительно заинтересованы в численной стабильности, вы можете выбрать самый безопасный путь и использовать from_logits=True
без использования какой-либо функции активации на последнем слое модели.
Теперь, чтобы ответить на исходный вопрос, истинные метки или целевые значения (т. Е. y_true
) должны быть по-прежнему только нулями или единицы при использовании BinaryCrossentropy(from_logits=True)
. Скорее, это y_pred
(то есть выход модели), который не должен быть распределением вероятности в этом случае (т.е. сигмоидальная функция не должна использоваться на последнем слое, если from_logits=True
).