首页 > 解决方案 > 如何从 Keras 中的自定义损失函数中获取结果?

问题描述

我想在 Python 中实现一个自定义损失函数,它应该像这个伪代码一样工作:

aux = | Real - Prediction | / Prediction
errors = []
if aux <= 0.1:
 errors.append(0)
elif aux > 0.1 & <= 0.15:
 errors.append(5/3)
elif aux > 0.15 & <= 0.2:
 errors.append(5)
else:
 errors.append(2000)
return sum(errors)

我开始像这样定义指标:

def custom_metric(y_true,y_pred):
    # y_true:
    res = K.abs((y_true-y_pred) / y_pred, axis = 1)
    ....

但我不知道如何获取ifelse的 res 值。另外我想知道什么必须返回函数。

谢谢

标签: pythontensorflowmachine-learningkerasloss

解决方案


另外我想知道什么必须返回函数。

自定义指标可以在编译步骤中传递。

该函数需要(y_true, y_pred)作为参数并返回单个tensor值。

但我不知道如何获取 if 和 else 的 res 值。

您可以返回resultfromresult_metric函数。

def custom_metric(y_true,y_pred):
     result = K.abs((y_true-y_pred) / y_pred, axis = 1)
     return result

第二步是使用keras回调函数来查找错误的总和。

可以定义回调并将其传递给fit方法。

history = CustomLossHistory()
model.fit(callbacks = [history])

最后一步是创建CustomLossHistory类以找出sum您预期的错误列表。

CustomLossHistory将从中继承一些默认方法keras.callbacks.Callback

  • on_epoch_begin:在每个纪元开始时调用。
  • on_epoch_end:在每个 epoch 结束时调用。
  • on_batch_begin:在每批开始时调用。
  • on_batch_end:在每批结束时调用。
  • on_train_begin:在模型训练开始时调用。
  • on_train_end:在模型训练结束时调用。

您可以在Keras 文档中阅读更多内容

但是对于这个例子,我们只需要on_train_beginon_batch_end方法。

执行

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.errors= []

    def on_batch_end(self, batch, logs={}):
         loss = logs.get('loss')
         self.errors.append(self.loss_mapper(loss))

    def loss_mapper(self, loss):
         if loss <= 0.1:
             return 0
         elif loss > 0.1 & loss <= 0.15:
             return 5/3
         elif loss > 0.15 & loss <= 0.2:
             return 5
         else:
             return 2000

训练模型后,您可以使用以下语句访问错误。

errors = history.errors

推荐阅读