Keras自定义损失函数,用于传递y_true和y_pred以外的参数

2024-04-26 03:49:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写keras自定义损失函数,其中我希望将以下内容传递给该函数: y_true、y_pred(这两个参数将自动传递)、模型内某个层的权重和一个常量

如下所示:

def Custom_loss(y_true, y_pred, layer_weights, val = 0.01):
    loss = mse(y_true, y_pred)
    loss += K.sum(val, K.abs(K.sum(K.square(layer_weights), axis=1)))
    return loss

但是上面的实现给了我错误。 我如何在keras中实现这一点


Tags: 函数模型layertrue参数defvalkeras
2条回答

您可以通过使用lambda操作符以另一种方式执行此操作,如下所示:

model.compile(loss= [lambda y_true,y_pred: Custom_loss(y_true, y_pred, val=0.01)], optimizer =...)

以这种方式保存和加载模型存在一些问题。解决方法是只保存权重并使用model.load_weights(...)

新答案

我想你正在寻找L2正则化。只需创建一个正则化器并将其添加到层中:

from keras.regularizers import l2

#in the target layers, Dense, Conv2D, etc.:
layer = Dense(units, ..., kernel_regularizer = l2(some_coefficient)) 

您也可以使用bias_regularizer
some_coefficient变量乘以权重的平方值

PS:如果代码中的val是常量,它不应该损害您的损失。但是您仍然可以使用下面的旧答案来表示val

旧答案

根据您的需要将Keras预期函数(带两个参数)包装到外部函数中:

def customLoss(layer_weights, val = 0.01):
    
    def lossFunction(y_true,y_pred):    
        loss = mse(y_true, y_pred)
        loss += K.sum(val, K.abs(K.sum(K.square(layer_weights), axis=1)))
        return loss

    return lossFunction

model.compile(loss=customLoss(weights,0.03), optimizer =..., metrics = ...)   

注意layer_weights必须作为“张量”直接来自层,因此不能使用get_weights(),必须使用someLayer.kernelsomeLayer.bias。(如果层的可训练参数使用不同的名称,则为相应的var名称)


这里的答案显示了如果外部变量随批处理而变,如何处理此问题:How to define custom cost function that depends on input when using ImageDataGenerator in Keras?

相关问题 更多 >