我是Keras,神经网络和Python的新手,但我非常渴望学习......我想使用自己的自定义丢失函数,但由于遇到上述障碍我遇到了麻烦:)
这就是我想要完成的事情:
首先,我的问题是:这有意义吗?我是否正确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行代码吗? :)这对其他人来说可能是显而易见的,但对我来说是一个巨大的障碍。
非常感谢,祝你有个美好的一天,
陶
答案 0 :(得分: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