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

Posted

技术标签:

【中文标题】以 y_true 依赖于 y_pred 的方式自定义 Keras 的损失函数【英文标题】:Customize Keras' loss function in a way that the y_true will depend on y_pred 【发布时间】:2016-12-05 16:52:05 【问题描述】:

我正在开发一个多标签分类器。我有许多输出标签 [1, 0, 0, 1...],其中 1 表示输入属于该标签,0 表示其他情况。

在我的例子中,我使用的损失函数是基于 MSE。我想改变损失函数,当输出标签为-1时,它会改变为这个标签的预测概率。

检查所附图片以最好地理解我的意思: 场景是 - 当输出标签为 -1 时,我希望 MSE 等于零:

这是场景:

在这种情况下,我希望将其更改为:

在这种情况下,第二个标签(中间输出)的 MSE 将为零(这是我不希望分类器了解此标签的特殊情况)。

感觉这是一种需要的方法,我真的不相信我是第一个考虑它的人,所以首先我想知道这种训练神经网络的方法是否有名字,其次我想知道我该怎么做。

我知道我需要更改损失函数中的一些内容,但我真的是 Theano 的新手,不知道如何在那里查找特定值以及如何更改张量的内容。

【问题讨论】:

我认为你可以使用 Switch 或 IfElse 来做到这一点:deeplearning.net/software/theano/cifarSC2011/… 你不需要在 theano 中做任何事情。使用 sample_weight 参数,传递 0 和 1(0 表示“忽略”元素) 但我想使用 1 和 0 作为合法标签,当标签为 -1 时忽略,不确定这是否适合我 【参考方案1】:

我相信这就是你要找的。​​p>

import theano
from keras import backend as K
from keras.layers import Dense
from keras.models import Sequential

def customized_loss(y_true, y_pred):
    loss = K.switch(K.equal(y_true, -1), 0, K.square(y_true-y_pred))
    return K.sum(loss)

if __name__ == '__main__':
    model = Sequential([ Dense(3, input_shape=(4,)) ])
    model.compile(loss=customized_loss, optimizer='sgd')

    import numpy as np
    x = np.random.random((1, 4))
    y = np.array([[1,-1,0]])

    output = model.predict(x)
    print output
    # [[ 0.47242549 -0.45106074  0.13912249]]
    print model.evaluate(x, y)  # keras's loss
    # 0.297689884901
    print (output[0, 0]-1)**2 + 0 +(output[0, 2]-0)**2 # double-check
    # 0.297689929093

【讨论】:

使用 tensorflow 后端时使用 switch 函数会引发错误。可以通过使用tf.where 函数来克服这个问题。 您使用的是什么 keras 和 tensorflow 版本?它适用于我的(2.0.8 和 1.3.0)。

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

从混淆矩阵中提取 y_true 和 y_pred

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

keras_API汇总积累(熟读手册)三损失函数

keras_API汇总积累(熟读手册)三损失函数

y_pred 和 y_true 具有不同大小时的精度、召回率、f 分数

我正在训练一个 keras 神经网络。我想要一个由 y_true*y_pred 给出的自定义损失函数。这是允许的吗?