如何在Keras中获得自定义丢失功能的结果?

时间:2018-04-27 11:25:18

标签: python tensorflow machine-learning keras loss

我想在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)
    ....

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

由于

3 个答案:

答案 0 :(得分:5)

  

另外我想知道什么必须返回该功能。

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

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

  

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

您可以从result功能返回result_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 :在每个纪元结束时调用。
  • on_batch_begin :在每批次的开头调用。
  • on_batch_end :在每批次结束时调用。
  • on_train_begin :在模特训练开始时调用。
  • on_train_end :在模特训练结束时调用。

您可以在Keras Documentation

中阅读更多内容

但是对于此示例,我们只需要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

答案 1 :(得分:1)

我会在这里进行一次飞跃并说这不起作用,因为它不可区分。损失需要是连续可微的,所以你可以在那里传播一个渐变。

如果你想做这项工作,你需要找到一种方法来做到这一点,而不会中断。例如,您可以尝试对4个离散值进行加权平均,其中权重强烈偏好最接近的值。

答案 2 :(得分:0)

直接附加到 self 对我不起作用,而是附加到 self 的 params dict 完成了这项工作,回答 op 它将是 self.params['error'] = [],然后添加到您认为合适的数组中。

class CustomCallback(tf.keras.callbacks.Callback):
     
     def on_train_begin(self, logs=None):
          self.params['error'] = []

     def on_epoch_end(self, epochs, logs=None):
          #do something with self.params['error']

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

#When train ends

error = history.params['error']