如何从 Keras 中的自定义损失函数中获取结果?
How to get results from custom loss function in 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 值。另外我想知道return函数有什么。
谢谢
我在这里跳一下,说这行不通,因为它不可微分。损失需要连续可微,这样你就可以通过那里传播梯度。
如果你想完成这项工作,你需要找到一种不间断的方法。例如,您可以尝试对 4 个离散值进行加权平均,其中权重强烈倾向于最接近的值。
Also I want to know what have to return the function.
可以在编译步骤传递自定义指标。
该函数需要将 (y_true, y_pred)
作为参数和 return 单个 tensor
值。
But I do not know how to get the value of the res for the if and else.
您可以 return 来自 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
class 以找出您预期的 错误 列表中的 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_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
直接附加到 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']
我想在 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 值。另外我想知道return函数有什么。
谢谢
我在这里跳一下,说这行不通,因为它不可微分。损失需要连续可微,这样你就可以通过那里传播梯度。
如果你想完成这项工作,你需要找到一种不间断的方法。例如,您可以尝试对 4 个离散值进行加权平均,其中权重强烈倾向于最接近的值。
Also I want to know what have to return the function.
可以在编译步骤传递自定义指标。
该函数需要将 (y_true, y_pred)
作为参数和 return 单个 tensor
值。
But I do not know how to get the value of the res for the if and else.
您可以 return 来自 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
class 以找出您预期的 错误 列表中的 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_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
直接附加到 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']