Как выводить точность в классе в 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]
}