Я использую нелинейную функцию потерь для классификатора с 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