2017-09-23 109 views
0

我是新來Keras框架和我想要實現的 Root Mean Squared Logarithmic Errorkeras自定義的損失函數

這裏的下列損失函數與tensorflow後端我的Keras代碼

def loss_function(y_true, y_pred): 
    ones = K.ones(shape=K.shape(y_pred).shape) 
    y_pred = tf.add(y_pred,ones) 
    y_true = tf.add(y_true,ones) 
    val = K.sqrt(K.mean(K.sum(K.log(y_pred)-K.log(y_true)))) 
    return val 

但我結束了收到以下錯誤:

ValueError: Error when checking input: expected dense_1_input to have shape (None, 16) but got array with shape (1312779, 11) 

與VAL返回0。

+0

什麼是網絡代碼(特別是輸入層)?你的數據的形狀是什麼?他們匹配嗎?每個數據點的屬性都很寬,而input_shape =(16,)而不是(11)? – maz

+0

這個錯誤與你的損失函數無關。這是關於你的輸入數據(訓練數據)。你的輸入數據'(1312779,11)'的形狀不能進入你想要形狀像'(任何東西,16)'的模型。 –

+0

謝謝@DanielMöller我進行了修改以匹配模型輸入中的數據維度。但是,在每個時代,我的損失爲0.0000e + 00。我的損失功能是否正確執行?如果不是我如何去執行? – prodo56

回答

0

您的操作順序相反。由於「log(true)-log(pred)」可以是負數也可以是正數(結果可能比預期的要高一點或低一點),所以平方是必須要做的第一件事情。 (廣場負責消除負面信號)。

而意思是最後一個(最外部的),因爲你首先要計算每個元素的錯誤,並且只有在這之後你才能得到錯誤的均值。 (平均功能已在其中攜帶和功能)。

所以:

def loss_function(y_true, y_pred): 

    y_pred = y_pred + 1 
    y_true = y_true + 1 
    return K.mean(K.square(K.log(y_pred)-K.log(y_true))) 

請注意,這不攜帶 「根」 的一部分。如果你想添加的話,我會說,根應該(在畫面不同的公式)的平均去之前

我會改用此:

return K.mean(K.sqrt(K.square(K.log(y_pred)-K.log(y_true)))) 

確保您的模型與激活輸出數大於或等於零結束:

  • RELU是確定
  • 乙狀結腸是確定
  • SOFTMAX是確定

其他的激活可能爲負值,將帶來錯誤與日誌:

  • 線是不正常
  • 正切是不正常
+0

謝謝@DanielMöller。它很棒! – prodo56

+0

好的:) - 請考慮將此標記爲正確答案。 –