python - 如何从 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)
....
但我不知道如何获取if和else的 res 值。另外我想知道什么必须返回函数。
谢谢
解决方案
另外我想知道什么必须返回函数。
自定义指标可以在编译步骤中传递。
该函数需要(y_true, y_pred)
作为参数并返回单个tensor
值。
但我不知道如何获取 if 和 else 的 res 值。
您可以返回result
fromresult_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_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 = history.errors
推荐阅读
- html - 如何将工具提示项目符号与标签字段内联
- node.js - nodejs和hummus-recipe中的Mailmerge pdf
- android - 如何在我的 android 应用程序上为我的 Firestore 中的每个集合动态创建布局元素?
- java - 如何使用 Stream Parallel Java 执行矩阵计算?
- facebook - 有没有办法删除 facebook 像素事件?
- android - getIntent().getExtras() 上的空指针;
- ios - SwiftUi 多个 foreach
- python-3.x - 如何修复:从守护进程收到的截断或过大的响应标头
- haskell - 如何从字符串中读取/解析 Int
- excel - 试图识别从一个数据库分割到另一个数据库的字符串(使用 Excel),最好使用什么公式/其他方法?