我正在尝试创建自定义指标来评估keras模型。如果y_true和y_pred都高于或低于某个值(在我的情况下为5),则评估包括返回1,否则返回0。以下lambda表达式是一个演示我想要实现的内容
lambda y_pred, y_true : 1 if y_true > 5 and y_pred > 5 or y_true < 5 and y_pred < 5 else 0
我尝试在自定义keras模型上实现它,执行以下操作:
def SAGR(y_true, y_pred):
maj = K.greater([y_true, y_pred], 5)
men = K.less([y_true, y_pred], 5)
aremaj= K.all(maj)
aremen = K.all(men)
res = K.any([aremaj, aremen])
return K.mean(K.cast(res,'float32'))
但该函数始终返回0.
最后一层的输出与形状[无,2]呈线性关系。任何人都可以向我解释一种实现自定义指标的方法吗?
由于
答案 0 :(得分:2)
当您检查aremaj= K.all(maj)
时,需要使用axis=0
进行检查。 aremen
和res
def SAGR(y_true, y_pred):
maj = K.greater([y_true, y_pred], 5)
men = K.less([y_true, y_pred], 5)
aremaj= K.all(maj, axis=0)
aremen = K.all(men, axis=0)
res = K.any([aremaj, aremen], axis=0)
res_final = K.mean(K.cast(res,'float32'))
print(K.eval(res_final))
return res_final
说明:
K.eval(maj) # Looks like this
[[False False True True]
[False True True False]]
K.eval(K.all(maj)) # evaluates to 1 value:
False
print(K.eval(K.all(maj, axis=0)))
# What we actually want is a comparison at axis 0 level.
[False False True False]
工作代码:Link
PS:您还可以使用更详细的变量名称,因为aremaj
不是非常具有描述性,SAGR
是大写但不具有描述性。