为什么Keras的评价_生成器的结果(准确性)与预测_生成器的结果(准确性)不同?

时间:2019-04-03 08:09:17

标签: python tensorflow keras deep-learning multilabel-classification

我创建了一个用于图像分类的模型,然后使用Keras进行学习和评估。

使用学习的模型进行准确性评估时出现问题。

共有1至11个12类,外加X个类。 1, 2, 3, 4, 5 ,6, 7, 8, 9, 10, 11, X

我使用两个功能evaluate_generatorpredict_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%

0 个答案:

没有答案