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

Posted

技术标签:

【中文标题】keras中的加权mse自定义损失函数【英文标题】:Weighted mse custom loss function in keras 【发布时间】:2018-02-24 19:12:42 【问题描述】:

我正在处理时间序列数据,输出提前 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

结果我目前收到此错误:

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】:

您可以使用这种方法:

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。您可以使用切片,但要避免迭代。

【讨论】:

我花了几个小时试图弄清楚这一点。谢谢! (1/idx)*K.square(yTrue-yPred) 中,* 是逐元素运算还是向量矩阵乘法运算?谢谢! 元素方面的。对于矩阵乘法,有K.dot()K.batch_dot() @DanielMöller 谢谢!但是K.square(yTrue-yPred) 的形状为 (n_samples, n_components),而1/idx 的形状为 (n_components,),在这种情况下元素乘法如何工作? @username123,缺少的维度(n_samples)会重复。

以上是关于keras中的加权mse自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章

R Keras 中的自定义损失函数

使用keras在损失函数中批量逐元素产品

如何在 keras 中创建自定义损失函数? (自定义加权二元交叉熵)

当损失是均方误差 (MSE) 时,啥函数定义 Keras 中的准确性?

Keras 自定义损失(chi2)线性回归

Keras 中的像素加权损失函数 - TensorFlow 2.0