keras 模式准确率高但预测不佳
Good accuracy but bad prediction on keras mode
我是机器学习的新手,我正在尝试将 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/step - loss: 0.0925 - accuracy: 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,
'precision': 0.256198347107438,
'recall': 0.256198347107438,
'support': 242},
'DME': {'f1-score': 0.23236514522821577,
'precision': 0.23333333333333334,
'recall': 0.23140495867768596,
'support': 242},
'DRUSEN': {'f1-score': 0.25311203319502074,
'precision': 0.25416666666666665,
'recall': 0.25206611570247933,
'support': 242},
'NORMAL': {'f1-score': 0.2827868852459016,
'precision': 0.2804878048780488,
'recall': 0.28512396694214875,
'support': 242},
'accuracy': 0.256198347107438,
'macro avg': {'f1-score': 0.256115602694144,
'precision': 0.25604653799637167,
'recall': 0.256198347107438,
'support': 968},
'weighted avg': {'f1-score': 0.256115602694144,
'precision': 0.2560465379963717,
'recall': 0.256198347107438,
'support': 968}}
您没有显示测试生成器,但确保设置了 shuffle=False。 data_test 和 data_test_gen 有什么区别?如果你有一个名为 data_test 的测试生成器,你可以从
获得真实的标签
true_categories=data_test.labels
然后在混淆矩阵和分类报告中使用这些
我是机器学习的新手,我正在尝试将 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/step - loss: 0.0925 - accuracy: 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, 'precision': 0.256198347107438, 'recall': 0.256198347107438, 'support': 242}, 'DME': {'f1-score': 0.23236514522821577, 'precision': 0.23333333333333334, 'recall': 0.23140495867768596, 'support': 242}, 'DRUSEN': {'f1-score': 0.25311203319502074, 'precision': 0.25416666666666665, 'recall': 0.25206611570247933, 'support': 242}, 'NORMAL': {'f1-score': 0.2827868852459016, 'precision': 0.2804878048780488, 'recall': 0.28512396694214875, 'support': 242}, 'accuracy': 0.256198347107438, 'macro avg': {'f1-score': 0.256115602694144, 'precision': 0.25604653799637167, 'recall': 0.256198347107438, 'support': 968}, 'weighted avg': {'f1-score': 0.256115602694144, 'precision': 0.2560465379963717, 'recall': 0.256198347107438, 'support': 968}}
您没有显示测试生成器,但确保设置了 shuffle=False。 data_test 和 data_test_gen 有什么区别?如果你有一个名为 data_test 的测试生成器,你可以从
获得真实的标签true_categories=data_test.labels
然后在混淆矩阵和分类报告中使用这些