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

问题描述 投票:6回答:2

我正在编写一个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中实现这一目标?

keras
2个回答
19
投票

新答案

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

from keras.regularizers import l2

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

你也可以使用bias_regularizersome_coefficient var乘以权重的平方值。

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?


0
投票

您可以使用lambda运算符执行此操作,如下所示:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.