You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow中全验证集与批量采样预测结果不一致问题排查

原因分析

核心问题是验证集的随机打乱导致两次遍历的样本顺序不匹配:

  • 使用image_dataset_from_directory并设置validation_split时,默认会开启shuffle=True,每次遍历数据集都会随机打乱样本顺序。
  • 调用functional_model.predict(validation_ds)时,会第一次遍历验证集生成预测结果y_pred;之后再遍历验证集收集y_true时,数据集会再次随机打乱,导致y_pred和y_true的样本完全错位,最终计算出的准确率完全失真。
  • 而逐批次手动预测时,y_true和y_pred是在同一次遍历中同步收集的,样本顺序完全对应,因此结果正确。

解决方法

1. 关闭验证集的随机打乱

创建验证集时显式设置shuffle=False,固定样本顺序,确保两次遍历的顺序一致:

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,
  shuffle=False  # 关闭打乱,固定样本顺序
)

2. 提前缓存验证集数据

将验证集转换为固定的数组,避免多次遍历的顺序变化:

# 将验证集转换为numpy数组集合
val_iterator = validation_ds.as_numpy_iterator()
x_val, y_val = [], []
for batch_x, batch_y in val_iterator:
    x_val.append(batch_x)
    y_val.append(batch_y)
x_val = np.concatenate(x_val, axis=0)
y_val = np.concatenate(y_val, axis=0)

# 基于固定数组预测
y_pred = functional_model.predict(x_val)
y_pred_classes = np.argmax(y_pred, axis=1)
y_true_classes = np.argmax(y_val, axis=1)

# 生成分类报告
report = classification_report(y_true_classes, y_pred_classes, target_names=class_names)
print(report)

3. 保持单次遍历同步收集数据

沿用手动逐批次预测的方式,在同一次遍历中同时获取真实标签和预测结果,从根源上避免顺序错位问题,这是最稳妥的方案。


内容的提问来源于stack exchange,提问作者aba ba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:12:34