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
相关产品推荐
相关产品推荐

