Было ли у кого-нибудь убедительное решение, позволяющее заставить custom_binarycrossentropy работать?
Я испробовал все возможные методы (даже для того, чтобы весь размер обучающих данных совпадал с размером бакты, чтобы исключить зависимость от глобального усреднения во время пакетной обработки). ). Но я вижу существенную разницу между моей двоичной кросс-энтропийной реализацией и реализацией из керас (определяя loss = 'binary_crossentropy')
Мой обычный двоичный кросс-энтропийный код выглядит следующим образом
def _loss_tensor(y_true, y_pred):
y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = (y_true * K.log(y_pred) + (1.0 - y_true) * K.log(1.0 - y_pred))
return -K.mean(out)
def _loss_tensor2(y_true, y_pred):
y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = -(y_true * K.log(y_pred) + -(1.0 - y_true) * K.log(1.0 - y_pred))
return out
def _loss_tensor2(y_true, y_pred):
loss1 = K.binary_crossentropy(y_true, y_pred)
return loss1
Нет из этих методов работают. Он не работает, даже если я выполняю K.mean () до того, как получу результаты от пользовательской функции потерь.
Я не могу понять, что особенного делает с использованием loss = 'binary_crossentropy'. Когда я использую свою пользовательскую функцию потерь, обучение отстой, и она работает, как и ожидалось.
Мне нужна моя пользовательская функция потерь, чтобы манипулировать функцией потерь в зависимости от ошибки и дополнительно штрафовать за определенный тип ошибки классификации.