【问题标题】:Good accuracy but bad prediction on keras mode良好的准确性,但对 keras 模式的预测不佳
【发布时间】:2021-06-06 08:29:23
【问题描述】:

我是机器学习的新手,我正在尝试将 Google Colab 与 Tensorflow/Keras 结合使用,通过迁移学习 (Resnet50) 训练图像分类模型。

我从使用图像数据集开始,使用以下代码:

data_root = '/tmp/OCT2017'
 
batch_size = 32
img_height = 160
img_width = 160
 
data_train = tf.keras.preprocessing.image_dataset_from_directory(data_root + '/train',labels='inferred',
                                                                 image_size=(img_height,img_width),
                                                                 batch_size=batch_size)

对于小型测试数据集,这工作得很好,我得到了很好的准确性和很好的预测。 但是在尝试使用更大的数据集时,Colab 提供的所有 RAM 都被消耗了,所以我切换到生成器,使用:

data_generator = tf.keras.preprocessing.image.ImageDataGenerator()

data_train_gen = data_generator.flow_from_directory(data_root + '/train',
                                                target_size=(img_height,img_width),
                                                class_mode='sparse',
                                                batch_size=batch_size,
                                                shuffle=False)

并使用以下方法训练模型:

base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

with tf.device('/device:GPU:0'):
  epochs = 10
  history =model.fit(
    data_train_gen,
    validation_data=data_val_gen,
    epochs=epochs,
    callbacks=[csv_logger]
  )

使用这个设置我得到了很好的准确性:

model.evaluate(data_test)

31/31 [==============================] - 3s 93ms/步 - 损失:0.0925 - 准确度: 0.9742

[0.09248838573694229, 0.9741735458374023]

但是,当要求预测时,为了制作混淆矩阵,我得到了糟糕的结果

from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns

y_pred = model.predict(data_test)
predicted_categories = tf.argmax(y_pred, axis=1)
true_categories = tf.concat([y for x, y in data_test_gen], axis=0)

cm = confusion_matrix(predicted_categories, true_categories)

heatmap = sns.heatmap(cm, annot=True, cmap='YlGn', xticklabels=['CNV','DME','DRUSEN','NORMAL'],yticklabels=['CNV','DME','DRUSEN','NORMAL'])
plt.xlabel("True Labels")
plt.ylabel("Predictions")
plt.show()

预测的正确率约为 40% 混淆矩阵出现完全随机

classification_report(true_categories, predicted_categories, target_names=class_names, output_dict=True)

{'CNV': {'f1-score': 0.256198347107438, “精度”:0.256198347107438, “召回”:0.256198347107438, “支持”:242}, 'DME': {'f1-score': 0.23236514522821577, “精度”:0.23333333333333334, “召回”:0.23140495867768596, “支持”:242}, 'DRUSEN': {'f1-score': 0.25311203319502074, “精度”:0.25416666666666665, “召回”:0.25206611570247933, “支持”:242}, '正常':{'f1-score':0.2827868852459016, “精度”:0.2804878048780488, “召回”:0.28512396694214875, “支持”:242}, “准确度”:0.256198347107438, '宏平均':{'f1-score':0.256115602694144, “精度”:0.25604653799637167, “召回”:0.256198347107438, “支持”:968}, '加权平均':{'f1-score':0.256115602694144, “精度”:0.2560465379963717, “召回”:0.256198347107438, “支持”:968}}

【问题讨论】:

  • 你确定不打乱测试数据吗?
  • 感谢您的回复。我确定我不会对测试数据进行洗牌。所有数据集和生成器都有相同的代码,我只是更改路径终止

标签: tensorflow machine-learning keras image-classification


【解决方案1】:

您没有显示您的测试生成器,但请确保您设置了 shuffle=False。 data_test 和 data_test_gen 有什么区别?如果您有一个名为 data_test 的测试生成器,您可以从中获取真正的标签

true_categories=data_test.labels

然后在混淆矩阵和分类报告中使用这些

【讨论】:

  • 你好。我应该解释一下 data_test 和 data_test_gen 类似于 data_train 和 data_train_gen,我只是更改了文件的路径。
  • 这对我有用!我不知道为什么,但我想不知何故真正的标签混在一起了。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2020-03-13
  • 2020-04-21
  • 2020-01-21
相关资源
最近更新 更多