我想在Python中实现一个自定义损失函数,它的功能应该像以下伪代码一样工作:
aux = | Real - Prediction | / Predictionerrors = []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
的值。我还想知道函数应该返回什么值。
谢谢
回答:
我还想知道函数应该返回什么值。
自定义指标可以在编译步骤中传递。
函数需要接受(y_true, y_pred)
作为参数,并返回一个单一的tensor
值。
但我不知道如何在
if
和else
中获取res
的值。
你可以从result_metric
函数中返回result
。
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
类,以便找出你期望的errors列表的sum
。
CustomLossHistory
将继承keras.callbacks.Callback
的一些默认方法。
- on_epoch_begin:在每个epoch开始时调用。
- on_epoch_end:在每个epoch结束时调用。
- on_batch_begin:在每个批次开始时调用。
- on_batch_end:在每个批次结束时调用。
- on_train_begin:在模型训练开始时调用。
- on_train_end:在模型训练结束时调用。
你可以在Keras文档中了解更多信息
但对于这个例子,我们只需要on_train_begin
和on_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:
errors = history.errors