如何在theano上实现加权二进制交叉熵?
How to implement Weighted Binary CrossEntropy on theano?
如何在theano上实现加权二进制交叉熵
我的卷积神经网络只预测 0 ~~ 1 (sigmoid)。
我想这样惩罚我的预测:
基本上,当模型预测为 0 但事实为 1 时,我想惩罚更多。
问题:如何使用 theano 和 lasagne 创建这个 加权二进制交叉熵 函数?
我在下面试过这个
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)
但是我在下面得到这个错误:
TypeError:重塑中的新形状必须是矢量或 list/tuple 标量。转换为向量后得到 Subtensor{int64}.0.
参考:https://github.com/fchollet/keras/issues/2115
参考:https://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8
要解决您的语法错误:
改变
newshape = (T.shape(tgt)[0])
tgt = T.reshape(tgt, newshape)
到
newshape = (T.shape(tgt)[0],)
tgt = T.reshape(tgt, newshape)
T.reshape
需要一个轴元组,您没有提供,因此出现错误。
在惩罚假阴性(预测 0,真值 1)之前,请确保此预测错误不是基于训练数据的统计数据,如 。
感谢 lasagne 组的开发人员,我通过构建自己的损失函数解决了这个问题。
loss_or_grads = -(customized_rate * target_var * tensor.log(prediction) + (1.0 - target_var) * tensor.log(1.0 - prediction))
loss_or_grads = loss_or_grads.mean()
如何在theano上实现加权二进制交叉熵
我的卷积神经网络只预测 0 ~~ 1 (sigmoid)。
我想这样惩罚我的预测:
基本上,当模型预测为 0 但事实为 1 时,我想惩罚更多。
问题:如何使用 theano 和 lasagne 创建这个 加权二进制交叉熵 函数?
我在下面试过这个
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)
但是我在下面得到这个错误:
TypeError:重塑中的新形状必须是矢量或 list/tuple 标量。转换为向量后得到 Subtensor{int64}.0.
参考:https://github.com/fchollet/keras/issues/2115
参考:https://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8
要解决您的语法错误:
改变
newshape = (T.shape(tgt)[0])
tgt = T.reshape(tgt, newshape)
到
newshape = (T.shape(tgt)[0],)
tgt = T.reshape(tgt, newshape)
T.reshape
需要一个轴元组,您没有提供,因此出现错误。
在惩罚假阴性(预测 0,真值 1)之前,请确保此预测错误不是基于训练数据的统计数据,如
感谢 lasagne 组的开发人员,我通过构建自己的损失函数解决了这个问题。
loss_or_grads = -(customized_rate * target_var * tensor.log(prediction) + (1.0 - target_var) * tensor.log(1.0 - prediction))
loss_or_grads = loss_or_grads.mean()