【问题标题】:Keras evaluate_generator accuracy high, but accuracy of each class is lowKeras evaluate_generator 准确率高,但每个类的准确率低
【发布时间】:2020-04-23 06:32:51
【问题描述】:

我正在使用 Keras ImageDataGenerator 在 101-food-dataset 上加载和训练模型。我对 validationtest 使用 same 拆分。我还使用 sklearn.metrics.confusion_matrix 来计算每个类的准确度。

训练后,当我使用 evaluate_generator 时,我得到了很高的准确率。但是个别类的准确率很低。我犯了什么错误?

train_generator = train_datagen.flow_from_directory(
  train_data_dir,
  target_size=(img_height, img_width),
  batch_size=batch_size,
  class_mode='categorical',
  subset='training')

validation_generator = train_datagen.flow_from_directory(
  train_data_dir,
  target_size=(img_height, img_width),
  batch_size=batch_size,
  class_mode='categorical',
  subset='validation')

history = model.fit_generator(train_generator,
                steps_per_epoch = train_generator.samples // batch_size,
                validation_data=validation_generator,
                validation_steps=validation_generator.samples // batch_size,
                epochs=epochs,
                verbose=1,
                callbacks=[csv_logger, checkpointer])

loss, acc = model.evaluate_generator(validation_generator, steps=3, verbose=0)
print('loss: ', loss, 'accuracy: ', acc) # loss:  0.4534463981787364 accuracy:  0.8333333

y_pred = model.predict_generator(validation_generator)
y_pred = np.array([np.argmax(x) for x in y_pred])
y_test = validation_generator.classes

cm = confusion_matrix(y_test, y_pred)
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
cm.diagonal()
acc_each_class = cm.diagonal()

print('accuracy of each class: \n')
for i in range(len(labels)):
  print(labels[i], ' : ', acc_each_class[i])
print('\n')

'''
accuracy of each class: 

cannoli  :  0.085
dumplings  :  0.065
edamame  :  0.1
falafel  :  0.125
french_fries  :  0.12
grilled_cheese_sandwich  :  0.13
hot_dog  :  0.075
seaweed_salad  :  0.085
tacos  :  0.105
takoyaki  :  0.135
'''

【问题讨论】:

  • 为什么在整体准确率很高的情况下还希望类的准确率很高,您没有得到正确的答案吗?
  • 我怀疑我的代码有错误。当整体精度很高时,每个类不应该也显示出很高的精度吗?它们不是相互关联的吗?
  • 它们是相关的,两者都应该很高,尽管有时其中一个类会出现一些编码错误,这会使该特定类预测的准确性错误,而不是所有类
  • 那么我的编码错误在哪里?
  • 好像是已知的issue

标签: python tensorflow keras scikit-learn classification


【解决方案1】:

我调查了您的问题,我认为这是因为您有多个工作人员多次打开文件,要解决此问题,请务必设置:

shuffle = false

pickle_safe = True

工人 = 1

或仅通过 evaluate_generator 或 predict_generator 评估您的模型:

validation_generator2 = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary', shuffle=False)

score = model.evaluate_generator(validation_generator, nb_validation_samples/batch_size, workers=12)

scores = model.predict_generator(validation_generator2, nb_validation_samples/batch_size, workers=12)

【讨论】:

  • 不工作。顺便说一句,没有pickle_safe att。不再
  • 继续问题here 因为我猜问题出在其他地方
猜你喜欢
  • 2018-09-18
  • 2019-02-14
  • 2014-02-28
  • 2020-10-17
  • 1970-01-01
  • 2016-12-03
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多