文章目录
定义python函数
def my_huber_loss(y_true, y_pred):
error = y_true - y_pred
is_small_error = tf.abs(error) <= threshold
small_error_loss = tf.square(error) / 2
big_error_loss = threshold * (tf.abs(error) - (0.5 * threshold))
return tf.where(is_small_error, small_error_loss, big_error_loss)
model.compile(loss=my_huber_loss, optimizer=...)
需要注意的是:如果我们想要传入超参数,我们不能直接在函数内添加参数,而应该使用wrapper,因为作为loss函数只能够拥有 y _ t r u e , y _ p r e d y\_true,y\_pred y_true,y_pred两个参数
wrapper
# wrapper function that accepts the hyperparameter
def my_huber_loss_with_threshold(threshold):
# function that accepts the ground truth and predictions
def my_huber_loss(y_true, y_pred):
error = y_true - y_pred
is_small_error = tf.abs(error) <= threshold
small_error_loss = tf.square(error) / 2
big_error_loss = threshold * (tf.abs(error) - (0.5 * threshold))
return tf.where(is_small_error, small_error_loss, big_error_loss)
# return the inner function tuned by the hyperparameter
return my_huber_loss
类
同时,我们也可以定义一个loss类,可以支持更多操作。
from tensorflow.keras.losses import Loss
class MyHuberLoss(Loss):
# initialize instance attributes
def __init__(self, threshold=1):
super().__init__()
self.threshold = threshold
# compute loss
def call(self, y_true, y_pred):
error = y_true - y_pred
is_small_error = tf.abs(error) <= self.threshold
small_error_loss = tf.square(error) / 2
big_error_loss = self.threshold * (tf.abs(error) - (0.5 * self.threshold))
return tf.where(is_small_error, small_error_loss, big_error_loss)
需要注意的点:
- 尽量使用TensoFlow提供的API进行各种计算。例如 tensorflow.keras.backend提供的各种函数
- 传入类型和返回类型都必须是Tensor类型。(所以不要使用numpy的计算函数)
该类需要从Loss基类继承,更多的操作可以参阅TensorFlow官方文档
本文介绍了如何在Python中定义并封装Huber损失函数,以及如何通过wrapper函数接受超参数。此外,展示了如何创建一个自定义Loss类,继承自TensorFlow的Loss基类,以支持更丰富的操作。关键在于使用TensorFlow API进行计算,并确保输入输出类型为Tensor。

1万+

被折叠的 条评论
为什么被折叠?



