【问题标题】:Custom RMSPE loss function in keraskeras中的自定义RMSPE损失函数
【发布时间】:2017-02-21 10:55:11
【问题描述】:

我正在尝试在 keras 中定义自己的损失函数,即均方根百分比误差。 RMSPE 定义为:

我已将损失函数定义为:

from keras import backend as K
def rmspe(y_true, y_pred):
    sum = K.sqrt(K.mean(K.square( (y_true - y_pred) /
          K.clip(K.abs(y_true),K.epsilon(),None) ), axis=-1) )
    return sum*100.

但是经过几次迭代后,它给了我作为 nan 的损失值。有人可以指出我做错了什么。谢谢

【问题讨论】:

  • 你使用哪个后端?
  • 我正在使用张量流
  • 您是否检查过您的数据是否不包含Nans?
  • 是的,我已经检查过了。没有nans
  • 你的数据标准化了吗?你的ys 的minmax 是什么?

标签: python keras


【解决方案1】:

你剪掉了分母,这很好。但是当我检查我的机器时,张量流后端中的 epsilon 是 1e-7。因此,当您除以裁剪值时,您仍然可以将渐变放大一千万。您想要做的是剪辑您的渐变,您可以使用优化器的clipvalueclipnorm 参数来完成:

optimizer = SGD(clipvalue=10.0)

optimizer = SGD(clipnorm=2.0)

你必须根据你有多少输出变量和你的数据中有多少噪音来调整这个值。

【讨论】:

    【解决方案2】:

    当你的分母是 0 时,那就是 Nan。考虑在分母上加上一个小数,例如 0.0000001。

    【讨论】:

    • K.clip 已经在这样做了。您可以查看 keras.io/backend> 剪辑的作用。
    【解决方案3】:
    def rmspe(y_true, y_pred):
        return K.sqrt(K.mean(K.square((y_true - y_pred) / y_true)))
    

    【讨论】:

    • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的描述。
    • 这最终对我有用,但还涉及更多步骤。如果我自己给出答案,我不知道关于回答问题 + 分配赏金的政策是什么。
    【解决方案4】:

    我想我应该在经过广泛的研究和讨论后自己回答这个问题。我找到了两种可行的替代方案来优化 tensorflow+keras 中的 RMPSE。

    第一个是“技巧”:RMSPE 等效于权重为 $1/y_i^2$ 的加权 RMSE。所以第一个选项是使用'mse'作为损失并添加一个sample_weight参数作为$1/np.square(y_train)$。这工作得很好,但一旦你想在你的架构中使用其他权重/损失函数,可能会有点麻烦。

    Gregory Lopes 提到的替代方法是使用:

    def rmspe(y_true, y_pred):
        return K.sqrt(K.mean(K.square((y_true - y_pred) / y_true)))
    

    请务必注意,要使这两个选项起作用,您需要删除等于 0 或 nan 的目标。检查 nan (y_train.isna().sum()) 或 0 (y_train==0).sum() 相当简单,可以帮助您避免一些麻烦。

    至于为什么提到的解决方案不起作用。由于剪裁功能,它似乎来自数值不稳定性。更改剪辑行为会产生不同的错误。我不完全理解它为什么会发生,但删除它似乎可以解决问题。不知何故,为避免错误而实施的安全措施导致了错误。

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2017-12-18
      • 2020-03-27
      • 1970-01-01
      • 2018-10-28
      • 2017-12-29
      • 2018-11-12
      • 2018-12-21
      • 2020-02-27
      相关资源
      最近更新 更多