Почему результат (точность) методаrate_generator отличается от результата (точности) элементаgnast_generator в Keras? - PullRequest
1 голос
/ 03 апреля 2019

Я создал модель для классификации изображений с последующим обучением и оценкой с использованием 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%

...