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

Posted

技术标签:

【中文标题】Keras 自定义损失函数,用于传递 y_true 和 y_pred 以外的参数【英文标题】:Keras Custom loss function to pass arguments other than y_true and y_pred 【发布时间】:2018-04-02 03:38:09 【问题描述】:

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

【问题讨论】:

你也可以考虑add_loss...***.com/a/62402699/10375049 【参考方案1】:

新答案

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

from keras.regularizers import l2

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

您也可以使用bias_regularizersome_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?

【讨论】:

是巧合吗,customLoss 也正好有两个输入变量?还是被包装的函数再次被限制为两个输入参数? “lossFunction”必须始终有 2 个参数,即基本事实和预测。包装器(外部)函数无关紧要。 模型保存后似乎无法加载模型。它需要再次传递参数,至少对于张量是无法做到的 是的...如果您开始远离标准模型,在 keras 中保存和加载非常复杂。它需要 hacky 解决方法。有时我更喜欢重建整个模型(这意味着我保留模型的代码)并仅保存/加载权重。 但是你可以。您只需在加载模型时将损失函数传递给custom_objects。但请记住传递 keras 可能不知道的“一切”,从权重到损失本身。您必须保留您的自定义丢失代码。顺便说一句,如果想法是“使用”模型,则不需要损失、优化器等。这些仅用于训练。【参考方案2】:

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

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

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

【讨论】:

以上是关于Keras 自定义损失函数,用于传递 y_true 和 y_pred 以外的参数的主要内容,如果未能解决你的问题,请参考以下文章

以 y_true 依赖于 y_pred 的方式自定义 Keras 的损失函数

R Keras 中的自定义损失函数

Keras 后端自定义损失函数

GPU 上的 Keras 模型:在自定义损失函数中使用 Pandas

如何为 LSTM 实现 Keras 自定义损失函数

在 CNN 的 keras 自定义损失函数中操作数据