Я создал модель для классификации изображений с последующим обучением и оценкой с использованием Keras
.
При оценке точности с использованием изученной модели возникла проблема.
Всего 12 классов, от 1 до 11, плюс класс X.
1, 2, 3, 4, 5 ,6, 7, 8, 9, 10, 11, X
Я провел оценку точности, используя две функции evaluate_generator
и predict_generator
.
Используя выходные данные predict_generator
, класс с наибольшей вероятностью для каждого изображения обозначается как класс предсказания.
Таким образом, я оценил точность в соответствии с тем, являются ли фактический класс и предсказанный класс одинаковыми.
label_count = []
for label in labels:
if label != '1' :
test_id = test_id+[os.path.basename(fl) for fl in glob('{}/{}/*png'.format(test_path, label))]
if label == 'X' :
label_count+= ['12' for _ in glob('{}/{}/*png'.format(test_path, label))]
else :
label_count+= [label for _ in glob('{}/{}/*png'.format(test_path, label))]
else :
test_id = [os.path.basename(fl) for fl in glob('{}/{}/*png'.format(test_path, label))]
label_count+= [label for _ in glob('{}/{}/*png'.format(test_path, label))]
preds = model.evaluate_generator(
test_generator,
steps=len(test_id))
print("%s: %.2f%%" %(model.metrics_names[1], preds[1]*100))
preds = model.predict_generator(
test_generator,
steps=len(test_id),
verbose=1)
preds_list = list(preds)
temp=0
loss_count = 0
for pred in preds_list :
results = 0
top_ = 0
for i,pr in enumerate(pred) :
results += float(pr)*(i+1)
if float(pr) > top_ :
top_ = float(pr)
top = i+1
predict_ = round(results,2)
true_ = int(label_count[temp])
loss_ = abs(round(true_ - round(results,2),2))
if abs(top-true_) <= 1 :
loss_count += 1
# print('True class : ',true_,' Predict class : ',top,' Predict linear : ',predict_, ' loss : ', loss_)
temp += 1
print ('accuracy : ', round(loss_count/len(test_id)*100,2), '%')
evaluate_generator
вывод acc: 90.54%
но predict_generator
вывод accuracy : 56.76%