2017-07-24 177 views
0

我需要一個自定義的加權MSE損失函數。我在keras.backend定義它自定義損失函數Keras Tensorflow

from keras import backend as K 
def weighted_loss(y_true, y_pred): 
    return K.mean(K.square(y_pred - y_true) * 
    K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5))))  
    ,axis=-1 ) 

但是,試運行返回

weighted_loss(1,2) 
ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Exp_37:0", shape=(), dtype=float32)' 

weighted_loss(1.,2.) 
ZeroDivisionError: integer division or modulo by zero 

我不知道我的錯誤我做在這裏。

回答

3

無論您使用的是Tensorflow還是Theano都與您的問題無關。谷歌的意思是「張量」,如果這個詞讓你感到困惑。

看看如何Keras自己喪失功能測試已經實施here

def test_metrics(): 
    y_a = K.variable(np.random.random((6, 7))) 
    y_b = K.variable(np.random.random((6, 7))) 
    for metric in all_metrics: 
     output = metric(y_a, y_b) 
     print(metric.__name__) 
     assert K.eval(output).shape == (6,) 

你不能簡單地養活一個浮動或INT到張量計算。還請注意使用K.eval來獲得您正在查找的結果。

因此,嘗試用你的函數類似:

from keras import backend as K 
import numpy as np 

y_a = K.variable(np.random.random((6, 7))) 
y_b = K.variable(np.random.random((6, 7))) 
output = weighted_loss(y_a,y_b) 
result = K.eval(output) 

也沒有必要來定義您的自定義功能keras.backend - 如果你決定以後更新Keras什麼?

相反,你可以做你自己的代碼如下:定義,當你想編譯你的損失函數模型,返回你的損失函數

def get_weighted_loss(): 
    def weighted_loss(y_true, y_pred): 
     return K.mean(K.square(y_pred - y_true) * K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5)))),axis=-1 ) 
    return weighted_loss 

那麼功能,你可以這樣做:

model.compile(loss = get_weighted_loss()) 
+0

非常感謝您的回答。您的代碼成功評估weighted_loss函數。但是,當我嘗試使用這個weighted_loss作爲損失函數時,我得到一個找不到函數的錯誤。這是合理的假設,我的功能的表述是好的,只是Keras沒有閱讀我的功能? – axiom

+0

這完全合理是的。我已經添加了一些關於如何添加和使用損失函數的信息,不必在Keras源文件中弄亂 – 5Ke

+0

它完美地工作。非常感謝!但爲什麼我需要將損失函數包裝在另一個函數中?這我沒有做,因此代碼失敗了。我爲這個新手問題表示歉意。這恰好是我的第一個Python代碼。 – axiom

相關問題