2017-09-15 142 views
4

我正在處理時間序列數據,輸出60個預測的日子。keras中的加權mse自定義丟失函數

我目前使用的均方誤差爲我的損失函數,結果是壞

我想要實現的加權均方誤差,例如,早期的產出比後來者更重要。

加權均方根公式:

Weighted Mean Square Root formula

所以我需要一些方法來遍歷一個張量元素,與索引(因爲我需要通過迭代都在預測和真實值然後把結果寫成只有一個元素的張量,他們都是(?,60),但是真的是(1,60)個列表。代碼爲破碎版本

def weighted_mse(y_true,y_pred): 
    wmse = K.cast(0.0,'float') 

    size = K.shape(y_true)[0] 
    for i in range(0,K.eval(size)): 
     wmse += 1/(i+1)*K.square((y_true[i]-y_pred)[i]) 

    wmse /= K.eval(size) 
    return wmse 

我目前得到這個錯誤的結果:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dense_2_target' with dtype float 
[[Node: dense_2_target = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

讀了答覆類似的帖子,我不認爲口罩能完成任務,並在一個張量遍歷元素也無法工作,因爲我無法訪問其他張量中的相應元素。

任何建議,將不勝感激

回答

5

您可以使用此方法:

def weighted_mse(yTrue,yPred): 

    ones = K.ones_like(yTrue[0,:]) #a simple vector with ones shaped as (60,) 
    idx = K.cumsum(ones) #similar to a 'range(1,61)' 


    return K.mean((1/idx)*K.square(yTrue-yPred)) 

ones_likecumsum使用,您可以使用此功能喪失任何一種(samples,classes)輸出。


提示:與張量工作時,總是使用backend functions。你可以使用切片,但避免迭代。

+0

我花了數小時試圖弄清楚這一點。謝謝! –

+0

在'(1/idx)* K.square(yTrue-yPred)'中是'*'元運算還是向量 - 矩陣乘法運算?謝謝! – username123

+0

它是元素。對於矩陣乘法,有'K.dot()'和'K.batch_dot()'。 –