使用keras.utils.image_dataset_from_directory加载测试集结果差异原因问询
同数据集不同加载方式导致模型性能指标骤变的原因
问题场景
我使用Keras加载测试数据集时,两种方式得到的模型性能指标天差地别:
加载方式1:直接读取全量数据集
test_ds = keras.utils.image_dataset_from_directory(img_path, image_size=image_size, batch_size = batch_size)
对应指标:
准确率=0.5214,精确率=0.5950,F1分数=0.5435
加载方式2:通过拆分验证集获取数据
_, new_images = keras.utils.image_dataset_from_directory(img_path, shuffle=True, subset="both", seed=1, validation_split=0.9999, image_size=image_size, batch_size = batch_size)
对应指标:
准确率=0.9635,精确率=0.9658,F1分数=0.9688
补充:指标计算代码
predict = model.predict(new_images) actual = tf.concat([y for x, y in new_images], axis=0).numpy().tolist() # 计算最优阈值(基于Youden指数) fpr, tpr, thresholds = sklearn.metrics.roc_curve(actual, predict) J = tpr - fpr threshold = thresholds[np.argmax(J)] # 根据阈值生成预测结果 predicted = [1 if res > threshold else 0 for res in predict] # 输出指标 print(sklearn.metrics.accuracy_score(actual, predicted), sklearn.metrics.f1_score(actual, predicted), sklearn.metrics.precision_score(actual, predicted))
核心原因分析
1. 指标计算逻辑不一致(最可能)
你在方式2中用了基于Youden指数的最优阈值生成预测结果,但需要确认:计算方式1的指标时,是否用了同样的逻辑?
如果方式1直接用了默认的0.5阈值,而方式2用了针对当前数据集优化后的阈值,这种差异完全合理。尤其是在二分类任务中,当数据类别不平衡、模型输出概率分布偏斜时,最优阈值和0.5的差距会非常大,直接导致指标飙升。
2. 数据集拆分的隐含问题
当设置validation_split=0.9999时,new_images作为验证集几乎包含了全部数据,但要注意:
- 方式1的
test_ds是否真的和new_images完全一致?可以通过tf.data.Dataset.cardinality()查看样本数量是否匹配 shuffle=True虽然不会直接影响指标,但如果原数据集存在类别连续分布的情况,方式1的顺序加载可能刚好取到了模型难分类的样本段,不过这种概率极低
3. 数据集加载的细节差异
- 检查两种加载方式是否有隐含的预处理差异:比如是否无意中开启了数据增强?不过默认情况下
image_dataset_from_directory不会自动应用增强,除非指定了preprocessing_function - 确认标签映射是否一致:两种方式下,数据集的类别标签顺序是否相同?比如方式1的标签0对应A类,方式2是否也是如此?
类似经验
这种情况在分类任务中非常常见,踩坑的核心原因大多是变量控制不严格:
- 做对比实验时,必须保证除了要测试的变量(这里是加载方式),其他所有环节(包括指标计算逻辑、预处理、标签映射)完全一致
- 不要默认用0.5作为二分类阈值,一定要根据数据集的ROC曲线计算最优阈值,尤其是不平衡数据集
- 用
validation_split拆分数据时,最好打印拆分后的样本数量和类别分布,确认和预期一致
内容的提问来源于stack exchange,提问作者peacer
相关产品推荐
相关产品推荐

