我正在研究多标签分类器。我有许多输出标签[1、0、0、1 ...],其中1表示输入属于该标签,而0表示否则。
就我而言,我使用的损失函数基于MSE。我想以某种方式更改损失函数,即当输出标签为-1时,它将更改为该标签的预测概率。
检查所附图像以最好地理解我的意思:
场景是-当输出标签为-1时,我希望MSE等于零:
这是方案:
在这种情况下,我希望将其更改为:
在这种情况下,第二个标签的MSE(中间输出)将为零(这是特例,我不希望分类器了解此标签)。
感觉这是一种必需的方法,我真的不相信我是第一个考虑这种方法的人,因此我首先想知道是否有这种训练Neural Net的方法的名称,其次我想知道如何我可以做吗。
我知道我需要更改损失函数中的某些内容,但我真的是Theano的新手,并且不确定如何在此处查找特定值以及如何更改张量的内容。
最佳答案
我相信这就是您要寻找的。
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
关于python - 以y_true取决于y_pred的方式自定义Keras的损失函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38684768/