How to implement Weighted Binary CrossEntropy on theano?
我的卷积神经网络只能预测0~1(sigmoid) .
I want to penalize my predictions in this way :
基本上,我想在模型预测为0时惩罚更多,但事实是1 .
Question : 如何使用theano和lasagne创建此加权二进制CrossEntropy函数?
I tried this below
prediction = lasagne.layers.get_output(model)
import theano.tensor as T
def weighted_crossentropy(predictions, targets):
# Copy the tensor
tgt = targets.copy("tgt")
# Make it a vector
# tgt = tgt.flatten()
# tgt = tgt.reshape(3000)
# tgt = tgt.dimshuffle(1,0)
newshape = (T.shape(tgt)[0])
tgt = T.reshape(tgt, newshape)
#Process it so [index] < 0.5 = 0 , and [index] >= 0.5 = 1
# Make it an integer.
tgt = T.cast(tgt, 'int32')
weights_per_label = theano.shared(lasagne.utils.floatX([0.2, 0.4]))
weights = weights_per_label[tgt] # returns a targets-shaped weight matrix
loss = lasagne.objectives.aggregate(T.nnet.binary_crossentropy(predictions, tgt), weights=weights)
return loss
loss_or_grads = weighted_crossentropy(prediction, self.target_var)
But I get this error below :
TypeError: New shape in reshape must be a vector or a list/tuple of scalar. Got Subtensor.0 after conversion to a vector.
参考:https://github.com/fchollet/keras/issues/2115
参考:https://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8
2 回答
感谢lasagne group的开发人员,我通过构建自己的损失函数来解决这个问题 .
要解决语法错误:
更改
至
T.reshape
期望一个轴元组,你没有提供这个,因此错误 .在惩罚假阴性(预测0,真相1)之前,请确保此预测误差不是基于训练数据的统计数据,如@uyaseen suggested .