Двоичная кросс-энтропия не дает аналогичных результатов, когда у меня есть 2 выхода - PullRequest
0 голосов
/ 03 июля 2019

Я использую нелинейную функцию потерь для классификатора с 2 выходами. Первый получает binary_crossentropy() потерю, а второй используется для взвешивания потери как (1+LAM*stds), где stds - это второй результат модели.

Я считаю, что модель с 1 выходом и потерей "binary_crossentropy" работает лучше, чем моя модель, даже если LAM установлен на 0. В этом случае две модели должны работать одинаково, но эта всегда хуже.

В чем может быть разница?

def weightedBCE(y_true, y_pred):
    assert y_pred.shape[1] == 2
    y_pred_val = y_pred[:,0]
    stds = y_pred[:,1]
    bce = K.binary_crossentropy(y_true[:,0], y_pred_val)
    loss = bce * (1. + LAM*stds )
    return loss

Когда я делаю это обучение, я использую вывод как:

model.predict([X_test1, X_test2, X_test3])[:,0]

и для стандартной модели я делаю:

model.predict([X_test1, X_test2, X_test3])

Edit: Я сделал более простой тест, когда у меня есть 2 выхода для классификатора, но потери применяются только к одному из них:

def weightedBCE(y_true, y_pred):

    return K.mean(K.binary_crossentropy(y_true[:,0], y_pred[:,0]), axis=-1)

и он по-прежнему не дает того же результата, как если бы у меня был только 1 вывод с потерей:

def BCE(y_true, y_pred):
    bce = K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
    return bce
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...