簡體   English   中英

TF/KERAS:將列表作為單個輸出的損失傳遞

[英]TF/KERAS : passing a list as loss for single output

我的模型只有一個輸出,但我想結合兩個不同的損失函數,(注意:類數 = 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>]

您是否必須將兩種損失合二為一? 如果是這樣,你會怎么做?

還是最好有兩個輸出? 這會影響預測嗎? 會怎樣?

我在兩個損失函數之間進行加權,使用 alpha 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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM