【问题标题】:Implementing a custom loss function in Keras在 Keras 中实现自定义损失函数
【发布时间】:2017-03-26 15:25:48
【问题描述】:

我是 Keras、神经网络和 Python 的新手,但我非常渴望学习...我想使用自己的自定义损失函数,但由于有上述障碍,我遇到了麻烦:)

这就是我想要完成的:

  • Y_true 是一个浮点数,可以是负数也可以是正数
  • 模型将预测一个浮点数,可以是负数也可以是正数
  • 我想看看预测可以与 Y_true 值的符号 (+/-) 匹配多少次
  • 为此,我将 Y_pred 和 Y_true 相乘(因此,如果 Y_pred 和 y_true 具有相同的符号,则结果为正,如果它们不同,则结果为负)
  • 然后我会计算这个乘法结果中正值和负值的数量,这样我就可以看到预测有多少次具有相同符号以及多少次相反
  • 最后我会返回比率

首先,我的问题是:这有意义吗?我是否正确 y_pred 和 y_true 将具有批量大小的形状?所以对于前。如果批次数为 100,如果 100 个预测中有 60 个与 y_true 符号匹配,那么损失将为 0.60?

其次,其实我还没有代码 :) 这是伪代码:

def prediction_sign_accuracy(y_true, y_pred):
    y_sign_difference = y_pred * y_true
    pos_count = count number of positive values in y_sign_difference
    neg_count = count number of negative values in y_sign_difference
    if neg_count == 0:
      return a constant zero result
    else:
       return pos_count/neg_count

你能帮我写这大约 10 行代码吗? :) 这对其他人来说可能很明显,但对我来说却是一个巨大的障碍。

在此先感谢您,祝您有美好的一天,

塔马斯

【问题讨论】:

  • 您的损失函数似乎不可微......就像准确度不可微一样:)
  • 我不认为制作自己的损失函数是正确的方法。为什么不直接将 Y_true 设为 1.0(如果为正数)和 0.0(如果为负数),然后使用分类交叉熵作为损失,使用 softmax 作为激活?
  • 非常感谢您的意见!

标签: python tensorflow theano keras


【解决方案1】:

在为 keras 编写度量或损失函数时,首先要记住的是,它必须使用 keras.backend 编写为张量。

为了实现这一点,让我们首先使用 numpy 数组“模拟”我们想要做什么:

import numpy as np
y_true = np.array([1,4,-3,-1])
y_pred = np.array([5,-2,-1,1])
y_sign_difference = y_pred * y_true # this gives array([ 5, -8,  3, -1])
is_positive = np.greater(y_sign_difference, 0.0).astype(float)
# is_positive becomes array([ 1, 0, 1, 0])
pos_count = np.sum(is_positive) # --> 2

并使用 np.less 作为底片。

现在我们可以尝试编写该损失函数(恕我直言,这是一个度量标准)。基本上,你所要做的就是在正确的地方把 np 变成 K :

from keras import backend as K
def prediction_sign_accuracy(y_true, y_pred):
    y_sign_difference = y_pred * y_true
    pos_count = K.sum(K.cast(K.greater(y_sign_difference, 0.0), 'float32')
    # etc etc I'm not paid for this ;-)

哦,顺便说一句,如果你想测试这个功能,你需要相应地喂它,例如:

import numpy as np
y_true = K.constant(np.array([1,4,-3,-1]))
y_pred = K.constant(np.array([5,-2,-1,1]))

K.eval(prediction_sign_accuracy(y_true, y_pred)) # --> 1.0

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2018-05-25
    • 2021-05-23
    • 2021-10-25
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多