Ace*_*elo 7 python machine-learning loss keras tensorflow
我想在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)
Run Code Online (Sandbox Code Playgroud)
我开始像这样定义指标:
def custom_metric(y_true,y_pred):
# y_true:
res = K.abs((y_true-y_pred) / y_pred, axis = 1)
....
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得if和else的res值.另外我想知道什么必须返回功能.
谢谢
另外我想知道什么必须返回功能.
可以在编译步骤中传递自定义指标.
该函数需要(y_true, y_pred)作为参数并返回单个tensor值.
但我不知道如何获得if和else的res值.
您可以返回resultfrom result_metric功能.
def custom_metric(y_true,y_pred):
result = K.abs((y_true-y_pred) / y_pred, axis = 1)
return result
Run Code Online (Sandbox Code Playgroud)
第二步是使用keras回调函数来查找错误的总和.
该回调可以被定义并传递给fit方法.
history = CustomLossHistory()
model.fit(callbacks = [history])
Run Code Online (Sandbox Code Playgroud)
最后一步是创建CustomLossHistory该类,以找出sum您期望的错误列表.
CustomLossHistory将继承一些默认方法keras.callbacks.Callback.
您可以在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
Run Code Online (Sandbox Code Playgroud)
在训练模型后,您可以使用以下语句访问错误.
errors = history.errors
Run Code Online (Sandbox Code Playgroud)