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

Uda*_*r S 10 keras

我正在编写一个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
Run Code Online (Sandbox Code Playgroud)

但上面的实现给了我错误.我怎样才能在keras中实现这一目标?

Dan*_*ler 20

新答案

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

from keras.regularizers import l2

#in the target layers, Dense, Conv2D, etc.:
layer = Dense(units, ..., kernel_regularizer = l2(some_coefficient)) 
Run Code Online (Sandbox Code Playgroud)

你也可以使用bias_regularizer.
some_coefficientVAR是由重量的平方值相乘.

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 = ...)   
Run Code Online (Sandbox Code Playgroud)

请注意,layer_weights必须直接来自图层作为"张量",所以你不能使用get_weights(),你必须去someLayer.kernelsomeLayer.bias.(或者对于可训练参数使用不同名称的图层的相应var名称).


这里的答案显示了如果你的外部变量是批量变量的,如何处理:如何定义在Keras中使用ImageDataGenerator时依赖于输入的自定义成本函数?