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