TF / KERAS: передача списка как потери для одного выхода - PullRequest
1 голос
/ 13 февраля 2020

У меня есть только один выход для моей модели, но я хотел бы объединить две разные функции потерь ( Примечание: число КЛАССОВ = 24 ).

c = 0.8
lamda = 32

# My personalized loss function
def selective_loss(y_true, y_pred): .
    loss = K.categorical_crossentropy(
        K.repeat_elements(y_pred[:, -1:], CLASSES, axis=1) * y_true[:, :-1],
        y_pred[:, :-1]) + lamda * K.maximum(-K.mean(y_pred[:, -1]) + c, 0) ** 2
    return loss

p = np.ones(CLASSES) / CLASSES#The weights of class.

#And doing de model compile.
model.compile(loss = ['categorical_crossentropy', selective_loss],
              loss_weights = p,
              optimizer= sgd,                            
              metrics = ['accuracy'])

Но это жалуется, что мне нужны два выхода, потому что я определил две потери:

ValueError: When passing a list as loss, it should have one entry per model outputs. The model has 1 outputs, but you passed loss=['categorical_crossentropy', <function selective_loss at 0x7fcfb68daa60>]

Придется ли вам объединить две потери в одну? И если да, то как бы вы это сделали?

Или лучше иметь два выхода? Повлияет ли это на прогноз? Как бы это было?

1 Ответ

0 голосов
/ 14 февраля 2020

Я выполняю взвешивание между двумя функциями потерь, использую альфа 0,5, но допустим и другой тип с плавающей запятой:

#Private loss is the selective_loss.
def total_loss(y_true, y_pred):
    alpha = 0.5
    return (1-alpha)*categorical_crossentropy(y_true, y_pred) + alpha*selective_loss(y_true, y_pred)

#Compile the model with weighting loss.
model.compile(loss = total_loss,
              loss_weights = p,
              optimizer= sgd,                            
              metrics = ['accuracy'])
...