以y_true取决于y_pred的方式自定义Keras的损失函数

Lio*_*gen 7 python classification theano keras

我正在研究多标签分类器.我有很多输出标签[1,0,0,1 ...],其中1表示输入属于该标签,0表示否则.

在我的情况下,我使用的损失函数基于MSE.我想以一种方式改变损失函数,当输出标签为-1时,它将改变为该标签的预测概率.

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

这是场景: 在此输入图像描述

在这种情况下,我希望它改为:

在此输入图像描述

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

感觉这是一个必要的方法,我真的不相信我是第一个考虑它的人,所以首先我想知道是否有这样的训练神经网络的名称,其次我想知道如何我可以做吗.

我知道我需要更改损失函数中的一些东西,但我真的是Theano的新手,并且不确定如何查找特定值以及如何更改张量的内容.

Van*_*Van 7

我相信这就是你要找的.

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