Keras中image_dataset_from_directory提取混淆矩阵标签异常问题
解决Keras中image_dataset_from_directory标签提取不一致的问题
你的问题核心在于image_dataset_from_directory设置shuffle=True时,每次迭代数据集都会重新打乱样本顺序,若分多次提取标签,两次结果必然不匹配,直接导致混淆矩阵、分类报告与模型验证准确率不符。以下是具体解决方案:
方案1:固定随机种子并一次性提取数据
给数据集设置固定seed,同时一次性遍历验证集提取所有标签和图像,避免多次访问带来的顺序变化:
# 初始化验证集时固定seed val_ds = tf.keras.utils.image_dataset_from_directory( validation_dir, image_size=(img_height, img_width), batch_size=batch_size, shuffle=True, seed=42 # 固定随机种子确保打乱顺序一致 ) val_ds = val_ds.cache().prefetch(buffer_size=tf.data.AUTOTUNE) # 缓存优化,避免重复打乱 # 一次性提取所有标签和图像 validation_labels = [] validation_data = [] for batch_images, batch_labels in val_ds: validation_labels.extend(batch_labels.numpy()) validation_data.extend(batch_images.numpy()) # 生成预测结果 predictions = model.predict(np.array(validation_data)) predicted_labels = np.argmax(predictions, axis=1) # 生成混淆矩阵和分类报告 from sklearn.metrics import confusion_matrix, classification_report print("混淆矩阵:") print(confusion_matrix(validation_labels, predicted_labels)) print("\n分类报告:") print(classification_report(validation_labels, predicted_labels))
方案2:评估阶段关闭shuffle
如果仅用于模型评估,无需打乱验证集,直接设置shuffle=False,这样样本顺序固定,多次访问标签结果一致:
val_ds = tf.keras.utils.image_dataset_from_directory( validation_dir, image_size=(img_height, img_width), batch_size=batch_size, shuffle=False # 关闭打乱,固定样本顺序 ) # 提取标签 validation_labels = [] for _, labels in val_ds: validation_labels.extend(labels.numpy()) # 生成预测并计算指标 predictions = model.predict(val_ds) predicted_labels = np.argmax(predictions, axis=1) print(confusion_matrix(validation_labels, predicted_labels)) print(classification_report(validation_labels, predicted_labels))
问题原因说明
当shuffle=True且未固定seed时,image_dataset_from_directory每次迭代都会重新生成随机打乱后的样本序列,两次提取的标签对应不同的图像样本,自然与模型验证时的样本顺序不匹配,最终导致混淆矩阵和分类报告结果偏离真实验证准确率。
内容的提问来源于stack exchange,提问作者Mariusz Szymoniak
相关产品推荐
相关产品推荐

