y_pred 的自定义损失函数 Keras 仅高于某个阈值

Posted

技术标签:

【中文标题】y_pred 的自定义损失函数 Keras 仅高于某个阈值【英文标题】:Custom loss function Keras for y_pred above a certain threshold value only 【发布时间】:2020-10-12 14:52:53 【问题描述】:

如何在 keras 回归中编写自定义损失函数,其中 MAE 仅针对高于某个阈值的 y_pred 计算。 例如。 y_true = [10 , 14 , 23 , 30 , 5 , 4] , y_pred = [8 , 12 , 27 , 38 , 10 , 8]

如何编写自定义损失函数,其中仅计算 y_pred 值大于 20 的 MAE(平均绝对误差),即 y_pred > 20 的 MAE 即 [23,30] 得出 6 [(27-23) + (38 -30)]/2

这个问题出现了,因为我需要只正确预测最高预测范围的模型,这样我就可以只使用那些返回最高预测的数据点,因为其余的较低预测数据对我没有用。 像 -

def custom_loss(y_pred, y_true):
    for y_pred > 20:
        result =MAE(y_pred , y_true)
    return result

【问题讨论】:

【参考方案1】:

对于 Keras 损失函数,据我了解,您应该坚持使用 Keras 后端函数。看看here,我已经链接了 Tensorflow Keras 后端文档。

有一个函数可能对您有用,称为 map_fn,它允许您将函数映射到所有 y_pred y_true 对,但可能有几种不同的方法可以解决这个问题,文档应该会有所帮助!

【讨论】:

感谢您的回复。在我需要 MAE 用于 y_pred、y_true 对(其中 y_pred > 20)的即时情况下,您能否帮助编写任何一种可能对我有用的方法。我来自非编程背景,正在学习它并在这里遇到了障碍。 【参考方案2】:

这样试试

def custom_loss(y_true, y_pred):
    
    y_pred = y_pred[y_pred>20]
    y_true = y_true[y_pred>20]
    
    return tf.reduce_mean(tf.abs(y_true-y_pred))

n_sample = 1000
X = np.random.uniform(0,5, (n_sample,10))
y = np.random.randint(0,50, n_sample)

inp = Input((10,))
x = Dense(32, activation='relu')(inp)
out = Dense(1)(x)
model = Model(inp, out)

model.compile('adam',loss=custom_loss)
model.fit(X,y, epochs=10)

这种损失可能会导致 nan,因为批次中的所有预测都可能低于 20,因此请注意预测的大小

【讨论】:

以上是关于y_pred 的自定义损失函数 Keras 仅高于某个阈值的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中基于输入数据的自定义损失函数

Keras 中的自定义损失函数 - 遍历 TensorFlow

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?

Keras中带有权重的自定义损失函数

Keras 后端自定义损失函数

R Keras 中的自定义损失函数