在TensorFlow中使用整个验证数据集与批量采样时,模型预测不一致

我在使用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,它们被分别打乱并且不再匹配。

在第二个例子中,你同时定义了预测和真实值,它们以相同的方式被打乱,一切正常。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注