В моей сети 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 выхода