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 中的自定义损失函数 - 遍历 TensorFlow