Python 在Keras中实现自定义损失函数

Python 在Keras中实现自定义损失函数,python,tensorflow,theano,keras,Python,Tensorflow,Theano,Keras,我是Keras、神经网络和Python的新手,但我非常渴望学习。。。我想使用我自己的自定义损失函数,但由于存在上述障碍,我遇到了麻烦:) 这就是我试图实现的目标: Y_true是一个浮点值,可以是负数也可以是正数 该模型将预测浮动,浮动也可以是负值或正值 我想看看有多少次预测可以匹配Y_真值的符号(+/-) 为此,我将Y_pred和Y_true相乘(因此,如果Y_pred和Y_true具有相同的符号,则结果为正,如果它们不同,则结果为负) 然后我会计算这个乘法结果中正负值的数量,这样我就能看到

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

这就是我试图实现的目标:

  • Y_true是一个浮点值,可以是负数也可以是正数
  • 该模型将预测浮动,浮动也可以是负值或正值
  • 我想看看有多少次预测可以匹配Y_真值的符号(+/-)
  • 为此,我将Y_pred和Y_true相乘(因此,如果Y_pred和Y_true具有相同的符号,则结果为正,如果它们不同,则结果为负)
  • 然后我会计算这个乘法结果中正负值的数量,这样我就能看到预测有多少次符号相同,多少次符号相反
  • 最后,我将返回比率
首先,我的问题是:这有意义吗?y_pred和y_true具有批量大小的形状,我是否正确?例如,对于批次号为100的情况,如果100个预测中有60个与y_真符号匹配,那么损失将为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行代码吗?:)这对其他人来说可能是显而易见的,但对我来说却是一个巨大的障碍

非常感谢,祝你度过愉快的一天


Tamás

在为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

现在我们可以试着编写损失函数(imho,这是一个度量)。基本上,您所要做的就是在正确的位置将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

你的损失函数似乎不可微。。。只是准确度是不可微的:)我不认为建立自己的损失函数是正确的方法。如果Y_为正,为什么不将Y_设置为真1.0,如果Y_为负,为什么不将Y_设置为真0.0,然后使用分类交叉熵作为损失,使用softmax作为激活?非常感谢您的输入!