2017-09-15 32 views
4

私は時系列データを扱い、60予測日を先に出力しています。私は加重平均を実装したいケラスで重み付けされたmseカスタム損失関数

私は現在、私の損失関数としての平均二乗誤差を使用していますし、結果は

悪いですが、早期の出力がはるかに重要以降のものよりもあるよう二乗誤差。

加重平均平方根の式:

Weighted Mean Square Root formula

だから私は、インデックスと、テンソルの要素を反復処理するためにいくつかの方法が必要です(私が予測と真値の両方を反復処理する必要があるため同時に、1つの要素でテンソルに結果を書いてください。両方とも(?、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"]()]] 

が同様のポストへの回答を読んでたので、私はマスクがタスクを達成することができると思うし、1つのテンソルの要素をループしていません私は他のテンソルの対応する要素にアクセスすることができないので、うまくいきません。

任意の提案は、あなたがこのアプローチを使用することができます

答えて

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)) 

cumsumones_likeの使用は、あなたが(samples,classes)出力のいずれかの種類には、この損失関数を使用することができます。


ヒント:テンソルを使用する場合は、常にbackend functionsを使用してください。スライスを使用できますが、反復は避けてください。

+0

これを理解するのに何時間も費やしました。ありがとうございました! –

+0

'(1/idx)* K.square(yTrue-yPred)'では、要素演算またはベクトル行列乗算演算は '*'ですか?ありがとう! – username123

+0

要素的です。行列の乗算には 'K.dot()'と 'K.batch_dot()'があります。 –

関連する問題