【问题标题】:Tensorflow/Keras custom loss functionTensorflow/Keras 自定义损失函数
【发布时间】:2018-10-28 00:00:29
【问题描述】:

我想在 keras 中创建一个自定义损失函数。

假设我有 yTrue 和 yPred,它们是真实标签和预测标签的张量 (n x m)。

我们将每个样本 n(即 yTrue 和 yPred 中的每一行)称为 yT 和 yP。 然后我想要一个在 yT[0] == 1 时计算 (yT-yP)^2 的损失函数,否则它将计算 (yT[0]-yP[0])^2。

也就是说:对于每个样本,我总是想计算第一个元素的平方误差 - 但我只想在真实标签的第一个元素 == 1 时计算其他元素的平方误差。

如何在自定义损失函数中做到这一点?

这是我目前得到的:

我需要用张量操作来做到这一点。 首先我可以计算

Y = (yTrue - yPred)^2

然后我可以定义一个掩码矩阵,其中第一列始终为 1,其他为 1,具体取决于 yTrue 的每一行的第一个元素的值。 所以我可以得到类似的东西

1 0 0 0 0 
1 0 0 0 0
1 1 1 1 1
1 1 1 1 1 
1 0 0 0 0 

然后我可以将这个矩阵与 Y 相乘,得到我想要的。

但是,如何生成屏蔽矩阵?特别是在tensorflow/keras中“如果行的第一个元素是1”这个条件怎么办?

也许有更好的方法来做到这一点? 谢谢

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    您可以在后端使用条件开关K.switch。大致如下:

    mse = K.mean(K.square(y_pred - y_true), axis=-1) # standard mse
    msep = K.square(y_pred[:,0] - y_true[:,0])
    return K.switch(K.equals(y_true[:,0], 1), mse, msep)
    

    编辑以处理每个样本条件。

    【讨论】:

    • 谢谢,但条件不是关于第一个样本的第一个元素(y_true[0,0])必须应用于每个样本。你认为 mse = K.mean(K.square(yPred - yTrue), axis=-1) ; msep = K.square(yTrue[:, 0] - yPred[:, 0]) ; return K.switch(K.equal(yTrue[:, 0], 1), mse, msep) 会起作用吗?它确实可以编译,但很难理解它是否正在做我想要它做的事情!
    • 啊,这有点不同,但它应该可以工作,因为 keras backend 实际上会检查更高维度的条件。
    猜你喜欢
    • 2017-12-29
    • 2020-10-21
    • 1970-01-01
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 2021-01-14
    • 2021-03-11
    相关资源
    最近更新 更多