keras:使用逻辑运算符实现自定义指标

时间:2018-04-21 14:14:05

标签: python keras

我正在尝试创建自定义指标来评估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]呈线性关系。任何人都可以向我解释一种实现自定义指标的方法吗?

由于

1 个答案:

答案 0 :(得分:2)

当您检查aremaj= K.all(maj)时,需要使用axis=0进行检查。 aremenres

也是如此
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是大写但不具有描述性。