Можно ли сделать пользовательскую функцию потерь с дополнительной предварительной обработкой y_pred? - PullRequest
0 голосов
/ 30 марта 2019

У меня проблемы с выполнением пользовательских функций потерь в Керасе.

В нашей модели размер конечного слоя (y_pred) равен [32, 365], что рассматривается как квантованная скорость дляследующие 365 таймфреймов.

Я хотел бы сделать пользовательскую функцию потерь, которая включает как перекрестную энтропию, так и RMSE.Таким образом, операции требуют 1) дополнительной предварительной обработки y_pred для генерации логитов размера [32, 1] для вычисления кросс-энтропии с двоичными метками (y_true) и 2) еще одной предварительной обработки y_pred для генерации дополнительной [32,1] значения для вычисления RMSE с числовыми метками.

Насколько я знаю, y_true и y_pred должны иметь одинаковое измерение в пользовательской функции потерь Keras.Но в моем случае размер y_pred равен [32, 365].Должен ли я сделать измерение y_true как [32, 365] или добавить вышеупомянутые этапы предварительной обработки в модель Keras до вычисления двух потерь?

В моем предыдущем решении я сделал пользовательскую функцию потерь таким образом, но теперь я сомневаюсь, что размерность y_true равна [32, 2].Если размерность [32, 365], какими будут значения данных ???

def losses(y_true, y_pred):
    a = 0.2
    loss1 = rmse_loss(y_true, preprocess1(y_pred))
    loss2 = ce_loss(y_true,  preprocess2(y_pred))
    loss = 0.2*loss1 + 0.8*loss2
    return loss

Дополнительная информация: Вывод train_generator представляет собой кортеж размеров [32, 10], [32, 2], где 32 - размер мини-партиии 10 - число ковариат, а 2 - количество меток (двоичных, числовых)

train_data = self.train_data_generator()
ntd = next(train_data)
print(ntd[0].shape, ntd[1].shape)
>>> [32, 10], [32, 2]

1 Ответ

1 голос
/ 30 марта 2019

Одной из альтернатив является выполнение операций в самой модели.Таким образом, у вас будет модель с двумя выходами, и вы можете применить функцию потерь отдельно к каждому из них с их собственными метками и весами потерь:

from keras.layers import Lambda

# the model definition goes here...

out1 = Lambda(preprocess1)(final_out) # you can also implement this using existing layers
out2 = Lambda(preprocess2)(final_out)

model = Model(inp, [out1, out2])

model.compile(loss=[rmse_loss, ce_loss], loss_weights=[0.2, 0.8], ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...