Keras度量实现

问题描述 投票:0回答:1

我正在尝试使用Keras建立一个使用指标的模型:特殊的f1得分。我正在努力执行它。

到目前为止,我有:

def f1_metric(y_true,y_pred):
   y_pred = K.one_hot(indices=K.argmax(y_pred,1), num_classes=4)
   arr = np.zeros((4,4))
   for pred,true in zip(y_pred,y_true):
       c_pred = K.constant(K.argmax(pred))
       c_true = K.constant(K.argmax(true))
       arr[c_true][c_pred] += 1
   fn = 2*arr[0][0]/(np.sum(arr[0]) + np.sum(arr.T[0])) if (np.sum(arr[0]) + np.sum(arr.T[0])) != 0 else 0
   fa = 2*arr[1][1]/(np.sum(arr[1]) + np.sum(arr.T[1])) if (np.sum(arr[1]) + np.sum(arr.T[1])) != 0 else 0
   fo = 2*arr[2][2]/(np.sum(arr[2]) + np.sum(arr.T[2])) if (np.sum(arr[2]) + np.sum(arr.T[2])) != 0 else 0
   fp = 2*arr[3][3]/(np.sum(arr[3]) + np.sum(arr.T[3])) if (np.sum(arr[3]) + np.sum(arr.T[3])) != 0 else 0
   return K.constant((fn + fa + fo + fp)/4)

当我使用f1_metric函数时出现以下错误:OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed

我确实知道不能使用循环。我已经阅读了一段时间,但仍然找不到其他选择。

如何正确实现for循环?

python tensorflow keras metrics
1个回答
0
投票

错误非常具体。 y_true和y_pred是张量类型,您不能遍历它们。您可以尝试使用to_numpy_array(y_pred)将它们转换为numpy数组,执行所需的操作,并像已经在做的那样返回张量值。

因此,一旦将y_true和y_pred转换为数组,就无需在for循环中使用K.constant,但是该函数必须返回张量值,因此请在此处保留K.constant((fn + fa + fo + fo + fp)/ 4)。

© www.soinside.com 2019 - 2024. All rights reserved.