自定义指标Keras

自定义指标Keras,keras,metrics,Keras,Metrics,我需要帮助在keras中创建自定义指标。我需要计算我的错误等于零的次数(y_pred-y_true=0) 我试过这个: n_train = 1147 # Number of samples on training set c = 0 # Variable to count def our_metric(y_true, y_pred): if y_true-y_pred == 0: c += 1 return c/n_train 但我得到了一个错误: OperatorNotAll

我需要帮助在keras中创建自定义指标。我需要计算我的错误等于零的次数(y_pred-y_true=0)

我试过这个:

n_train = 1147 # Number of samples on training set
c = 0 # Variable to count
def our_metric(y_true, y_pred):
  if y_true-y_pred == 0:
    c += 1
  return c/n_train
但我得到了一个错误:

OperatorNotAllowedInGraphError:使用
tf.Tensor
作为Python
bool
在图形执行中不允许。使用急切的执行或装饰 此函数带有@tf.function

编辑:使用此处提出的解决方案:

我这样解决了我的问题:

c = tf.constant(0)
def our_metric(y_true, y_pred):
  mask = K.equal(y_pred, y_true) # TRUE if y_pred = y_true
  mask = K.cast(mask,K.floatx())
  s = K.sum(mask)
  return s/n_train

不能在纯
tensorflow
中运行Python比较(使用静态图)

您必须启用
eager模式
,这是一个包装器,允许您使用一些Python控制语句(如
if
循环
)。只需根据错误建议修改函数,或在脚本开始时发出
tf.enable\u eager\u execution()


您可能还希望更新代码以使用
tf2.0
,它更直观,默认情况下启用了“急切”模式。

您不能在纯
tensorflow
中运行Python比较(使用静态图)

您必须启用
eager模式
,这是一个包装器,允许您使用一些Python控制语句(如
if
循环
)。只需根据错误建议修改函数,或在脚本开始时发出
tf.enable\u eager\u execution()


您可能还希望更新代码以使用
tf2.0
,这更直观,并且默认情况下启用了“急切”模式。

使用Keras后端函数计算值等于零的次数有多种方法。你只需要跳出框框思考一下。以下是一个例子:

diff = y_true - y_pred
count = K.sum(K.cast(K.equal(diff, K.zeros_like(diff)), 'int8'))

也可以使用
tf.count\u nonzero
操作,但是混合使用keras和显式tensorflow可能会导致问题。

有许多方法可以使用keras后端函数来计算值等于零的次数。你只需要跳出框框思考一下。以下是一个例子:

diff = y_true - y_pred
count = K.sum(K.cast(K.equal(diff, K.zeros_like(diff)), 'int8'))

也可以使用
tf.count\u nonzero
操作,但混合keras和显式tensorflow可能会导致问题。

这与精度度量完全相同我使用了此处提出的解决方案:这与精度度量完全相同我使用了此处提出的解决方案: