簡體   English   中英

自定義損失函數在Keras 2.1.4中產生極低的損失值

[英]Custom loss function produces extremely low loss value with Keras 2.1.4

我正在使用數值和分類值(時間序列)的數據集。 這是變量的示例:
AB C_1 C_2 D_1 D_2 D_3
前兩個是數值變量,C和D是具有onehot表示形式的類別變量。

下面是我的自定義損失函數。 為了將兩個以上的參數傳遞給函數,我使用了partial:

def mixed_num_cat_loss_backend(y_true, y_pred, signals_splits):
    if isinstance(y_true, np.ndarray):
        y_true = keras.backend.variable( y_true )
    if isinstance(y_pred, np.ndarray):
        y_pred = keras.backend.variable( y_pred )

    y_true_mse = y_true[:,:signals_splits[0]] 
    y_pred_mse = y_pred[:,:signals_splits[0]]
    mse_loss_v = keras.backend.square(y_true_mse-y_pred_mse)

    categ_loss_v = [ keras.backend.categorical_crossentropy(
                             y_pred[:,signals_splits[i-1]:signals_splits[i]], #keras.backend.softmax(y_pred[:,signals_splits[i-1]:signals_splits[i]]), 
                             y_true[:,signals_splits[i-1]:signals_splits[i]], 
                         from_logits=False) # force keras to normalize
                    for i in range(1,len(signals_splits)) ]

    losses_v = keras.backend.concatenate( [mse_loss_v, keras.backend.stack(categ_loss_v,1)], 1)

    return losses_v

一個紀元后,我的損失值非常低:

Epoch 1/100
76s - loss: 0.1040 - acc: 0.1781 - val_loss: 0.0016 - val_acc: 0.1330  
Epoch 2/100  
75s - loss: 9.2523e-04 - acc: 0.1788 - val_loss: 8.7442e-04 - val_acc: 0.1330

關鍵是,當我使用Keras 2.0.4時,我沒有這個問題。

自Keras 2.0.7起,交叉熵后端方法的簽名已更改。 根據發行說明

后端方法categorical_crossentropysparse_categorical_crossentropybinary_crossentropy sparse_categorical_crossentropy了其位置參數( y_truey_pred )的順序。 此更改不會影響losses API。 進行此更改是為了在losses API和后端API之間實現API一致性。

因此,在較新版本的y_pred調用categorical_crossentropy時,應切換y_truey_pred的位置。

暫無
暫無

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

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