Keras metri c реализация - PullRequest
       3

Keras metri c реализация

0 голосов
/ 13 марта 2020

Я пытаюсь построить модель с Keras, которая использует метри c: специальный показатель 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

Я понимаю, что циклы не может быть использован. Я уже некоторое время читаю, но все еще не могу найти альтернативу.

Как я могу правильно применить мой для l oop?

1 Ответ

0 голосов
/ 13 марта 2020

Ошибка довольно конкретная c. y_true и y_pred имеют тензорный тип, и вы не можете перебирать их. Вы можете попытаться преобразовать их в numpy массивы с помощью to_numpy_array (y_pred), выполнить необходимые операции и вернуть, как вы уже делаете, тензорное значение.

Так что нет необходимости в K.constant внутри для l oop после того, как вы превратили y_true и y_pred в массивы, но функция должна возвращать тензорное значение, поэтому оставьте там K.constant ((fn + fa + fo + фп) / 4).

...