keras中的加权mse自定义丢失函数

Eld*_* M. 7 python keras tensorflow loss-function

我正在处理时间序列数据,预计输出60天.

我目前正在使用均方误差作为我的损失函数,结果很糟糕

我想实现加权均方误差,使得早期输出比后期输出重要得多.

加权均方根公式:

加权均方根公式

所以我需要一些方法来迭代张量的元素,带有索引(因为我需要同时迭代预测值和真值,然后将结果写入只有一个元素的张量.它们都是(?,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
Run Code Online (Sandbox Code Playgroud)

我目前正在收到此错误:

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"]()]]
Run Code Online (Sandbox Code Playgroud)

阅读了类似帖子的回复之后,我认为掩码不能完成任务,并且在一个张量中循环元素也行不通,因为我无法访问其他张量中的相应元素.

任何建议,将不胜感激

Dan*_*ler 8

你可以使用这种方法:

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))
Run Code Online (Sandbox Code Playgroud)

使用ones_likewith cumsum允许您将此损失函数用于任何类型的(samples,classes)输出.


提示:使用张量时始终使用后端函数.您可以使用切片,但避免迭代.