Как выводить точность в классе в Keras?

Caffe может не только печатать общую точность, но и точность каждого класса.

В журнале Keras существует только общая точность. Мне трудно вычислить отдельную точность класса.

Эпоха 168/200

0s - убыток: 0,0495 - acc: 0,9818 - val_loss: 0,0519 - val_acc: 0,9796

Эпоха 169/200

0s - убыток: 0,0519 - acc: 0,9796 - val_loss: 0,0496 - val_acc: 0,9815

Эпоха 170/200

0s - убыток: 0,0496 - acc: 0,9815 - val_loss: 0,0514 - val_acc: 0,9801

Кто-нибудь, кто знает, как выводить per-class точность в keras?

Ответ 1

Точность и отзыв - более полезные меры для классификации нескольких классов (см. Определения). Следуя примеру Keras MNIST CNN (классификация 10 классов), вы можете получить значения для каждого класса, используя classification_report из sklearn.metrics:

from sklearn.metrics import classification_report
import numpy as np

Y_test = np.argmax(y_test, axis=1) # Convert one-hot to index
y_pred = model.predict_classes(x_test)
print(classification_report(Y_test, y_pred))

Вот результат:

         precision    recall  f1-score   support

      0       0.99      1.00      1.00       980
      1       0.99      0.99      0.99      1135
      2       1.00      0.99      0.99      1032
      3       0.99      0.99      0.99      1010
      4       0.98      1.00      0.99       982
      5       0.99      0.99      0.99       892
      6       1.00      0.99      0.99       958
      7       0.97      1.00      0.99      1028
      8       0.99      0.99      0.99       974
      9       0.99      0.98      0.99      1009

avg / total   0.99      0.99      0.99     10000

Ответ 2

Для точности обучения в каждом классе: выполните нижеприведенный набор тренировочных данных - после (и/или до) обучения на наборе данных.


Для точности проверки каждого класса:
def per_class_accuracy(y_preds,y_true,class_labels):
    return [np.mean([
        (y_true[pred_idx] == np.round(y_pred)) for pred_idx, y_pred in enumerate(y_preds) 
      if y_true[pred_idx] == int(class_label)
                    ]) for class_label in class_labels]

def update_val_history():
    [val_history[class_label].append(np.mean( np.asarray(temp_history).T[class_idx] )
                             ) for class_idx, class_label in enumerate(class_labels)]

Пример:

class_labels = ['0','1','2','3']
val_history = {class_label:[] for class_label in class_labels}

y_true   = np.asarray([0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3])
y_preds1 = np.asarray([0,3,3,3, 1,1,0,0, 2,2,2,0, 3,3,3,3])
y_preds2 = np.asarray([0,0,3,3, 0,1,0,0, 2,2,2,2, 0,0,0,0])

y_preds1 = model.predict(x1)
temp_hist.append(per_class_accuracy(y_preds1,y_true,class_labels))
update_val_history()
y_preds2 = model.predict(x2)
temp_hist.append(per_class_accuracy(y_preds2,y_true,class_labels))
update_val_history()

print(val_history)

>> {
"0": [0,25, 0,50],
"1": [0,50, 0,25],
"2": [0,75, 1,00],
"3": [1,00, 0,00]
}