I'm working on a multi-label classifier. I have many output labels [1, 0, 0, 1...] where 1 indicates that the input belongs to that label and 0 means otherwise.
我正在研究一个多标签分类器。我有许多输出标签[1,0,0,0,1…]]1表示输入属于该标签,0表示不属于该标签。
In my case the loss function that I use is based on MSE. I want to change the loss function in a way that when the output label is -1 than it will change to the predicted probability of this label.
在我的例子中,我使用的损失函数是基于MSE的。我想要改变损失函数当输出标签为-1时它会改变这个标签的预测概率。
Check the attached images to best understand what I mean: The scenario is - when the output label is -1 I want the MSE to be equal to zero:
检查附件的图片,以更好地理解我的意思:当输出标签为-1时,我希望MSE等于零:
这是场景:
And in such case I want it to change to:
在这种情况下,我希望它变成:
In such case the MSE of the second label (the middle output) will be zero (this is a special case where I don't want the classifier to learn about this label).
在这种情况下,第二个标签(中间输出)的MSE将为零(这是我不希望分类器了解这个标签的特殊情况)。
It feels like this is a needed method and I don't really believe that I'm the first to think about it so firstly I wanted to know if there's a name for such way of training Neural Net and second I would like to know how can I do it.
感觉这是一种需要的方法,我真的不相信我是第一个想到它的人,所以首先我想知道这种训练神经网络的方法是否有名字,其次我想知道我该怎么做。
I understand that I need to change some stuff in the loss function but I'm really newbie to Theano and not sure about how to look there for a specific value and how to change the content of the tensor.
我知道我需要在损失函数中改变一些东西但是我对Theano很陌生不知道如何去寻找一个特定的值以及如何改变张量的内容。
1 个解决方案
#1
6
I believe this is what you looking for.
我相信这就是你要找的。
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
#1
6
I believe this is what you looking for.
我相信这就是你要找的。
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