我在使用TensorFlow和Keras进行图像分类任务的深度学习模型训练。我的模型在使用validation_ds数据集进行评估时,达到了很高的验证准确率。然而,当我从验证数据集中手动采样一个批次并进行预测时,结果明显不同且效果更差。
以下是我创建和使用验证数据集的方式:
validation_ds = tf.keras.preprocessing.image_dataset_from_directory( data_directory1, validation_split=0.2, subset="validation", seed=123, image_size=(img_height, img_width), batch_size=batch_size, )
当我使用整个验证数据集进行预测时,我执行以下操作:
# 预测标签y_pred = functional_model.predict(validation_ds)y_pred_classes = np.argmax(y_pred, axis=1)# 真实标签y_true = np.concatenate([y.numpy() for x, y in validation_ds], axis=0)y_true_classes = np.argmax(y_true, axis=1)# 生成分类报告report = classification_report(y_true_classes, y_pred_classes, target_names=class_names)print("分类报告:")print(report)
这种方法显示的性能要差得多。然而,当我手动采样一个批次并像这样进行预测时:
y_true = []y_pred = []for images, labels in validation_ds: y_true.extend(np.argmax(labels.numpy(), axis=1)) predictions = functional_model.predict(images) y_pred.extend(np.argmax(predictions, axis=1))y_true = np.array(y_true)y_pred = np.array(y_pred)# 生成分类报告report = classification_report(y_true, y_pred, target_names=class_names)print("分类报告:")
分类报告显示了合理的结果。
为什么在使用整个验证数据集和采样批次之间预测不一致?
如何确保验证数据集的预测一致且准确?
回答:
你在tf.keras.preprocessing.image_dataset_from_directory()
调用中隐式地设置了shuffle=True
。每次你迭代验证数据集时,它都会被打乱。
在你的第一个例子中,你分两步进行推理和定义y_true
,它们被分别打乱并且不再匹配。
在第二个例子中,你同时定义了预测和真实值,它们以相同的方式被打乱,一切正常。