Нелинейная комбинация потерь - PullRequest
2 голосов
/ 19 июня 2019

В моей сети 2 выхода. Я пытаюсь получить убыток на двух условиях, которые не являются линейной суммой двух потерь:

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

Окончательные слои моей модели определены следующим образом (outSall имеет 3 значения):

std = make_std_model()(outSall)
final = Dense(1, activation="sigmoid")(outSall)

output = concatenate([DSAfinal, std ], axis=-1)

Но это не работает, потому что Kears ожидает 1 функцию потерь на выход. Моя потеря использует оба выхода сети вместе.

Первый вывод является стандартным классификационным с потерей двоичной перекрестной энтропии, но я хочу, чтобы он был умножен на (1+ LAM* stds) с коэффициентом лямбды, умноженным stds. stds - второй выход сети.

Как я могу это сделать?

assert y_pred.shape [2] == 2

IndexError: список индексов вне диапазона

Обновление: У меня был дополнительный индекс, теперь исправленный. Увидеть ниже. Но я получаю сообщение об ошибке ниже.

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, y_pred_val)
    loss = bce * (1. + LAM*stds )
    return loss

ValueError: логиты и метки должны иметь одинаковую форму ((?,) Против (?,?)

Update2:

Керас предполагает, что y_true имеет ту же форму, что и y_pred. Какая была проблема. Изменен урон на:

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

Все еще существует некоторая проблема с обработкой двух выходов, см. Двоичная перекрестная энтропия, не дающая аналогичных результатов, когда у меня есть 2 выхода

1 Ответ

0 голосов
/ 19 июня 2019

Вместо создания модели Keras с двумя выходами создайте модель Keras с одним выходом, которая является объединением двух тензоров (для этого можно использовать keras.layers.Concatenate). Затем вы можете скомпилировать модель с помощью одной пользовательской функции потерь, как вы написали выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...