【问题标题】:How to define sample weights within custom loss function?如何在自定义损失函数中定义样本权重?
【发布时间】:2020-01-13 12:47:01
【问题描述】:

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

比如我要赋值:

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}}]]

我不明白这个错误是什么意思。 dense_120 是我的输出层,作为输出形状 (None,63)。

我觉得我的损失函数的定义有错误,我遗漏了什么?

【问题讨论】:

  • 嗯...很明显,您有形状为 64 的数据和输出形状为 63 的模型。
  • 我使用了64的batch_size(随机选择),这似乎影响了事情。将它放在 63 上会产生相同的错误,但现在是 [45] 与 [20000,63]。把它放在 1 让我运行我的脚本。你能解释一下为什么 batch_size 很重要吗?
  • 您需要提供有关您正在做什么的足够信息。无法判断您的输出形状为何表现异常。

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


【解决方案1】:

正如 Daniel 所说,您的输出层应该包含 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)

【讨论】:

  • Sample_weights 要求我处理我试图避免的数据维度。我检查了输入/输出等。一切都是一样的大小。
  • sample_weights 如果您的数据是时间序列,则只需要您传递一个二维数组 - 但听起来不是吗?更多细节可以帮助人们回答问题,例如 model.summary() 和数据的形状
猜你喜欢
  • 2021-12-15
  • 2019-06-25
  • 2020-06-09
  • 1970-01-01
  • 2018-09-23
  • 2020-01-19
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多