我是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行代码吗? :)对其他人来说这也许很明显,但对我来说却是一个巨大的障碍。

非常感谢,祝您有美好的一天,

塔玛斯

最佳答案

为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

07-28 02:28
查看更多