在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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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