如何在自定义损失函数中定义样本权重?

时间:2019-09-11 16:16:33

标签: python-3.x keras loss-function

我需要对二进制序列进行分类,在这里我希望为序列的后面部分分配更高的权重。

例如,我要分配:

sequence      -- weights for the samples in this sequence
[0,0,0,1,1,1] -- [1,1,1,2,3,4]

输入的形状为m x n,因此m个样本的长度为n。

我想在自定义损失函数中分配权重,因为我想学习它是如何工作的(并且通过使用sample_weight,我遇到了各种维数问题)。

现在我使用以下损失函数:

def weightedLoss(weight):
    def binaryPart(yTrue,yPred):
        return K.mean(loss.binary_crossentropy(yTrue,yPred)*weight)  
    return binaryPart

权重是包含样本权重的m x n矩阵。我收到的错误消息是:(m = 20000,n = 63)

  

InvalidArgumentError:不兼容的形状:[64]与[20000,63]      [[{{node loss_39 / dense_120_loss / mul}}]]

我不明白此错误的含义。 density_120是我的输出层,给出的输出形状为(None,63)。

我觉得损失函数的定义有误,我想念什么?

1 个答案:

答案 0 :(得分:1)

正如丹尼尔所说,您的输出层应包含64个神经元,但看起来当前包含63个神经元。这应该可以解决您的错误。

为回答有关样本权重的问题,Keras .fit方法已经接受了sample_weights的参数,因此您可以在不创建自定义损失函数的情况下使用它。

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1)