Keras中validation_split未按预期划分验证集问题求助
问题原因分析
- 实际加载的样本数未达预期:你以为训练集有24977张图像,但实际导入到
x_2和y中的样本数只有7030张——703正好是7030的10%。大概率是图像加载环节出了问题:- 部分图像格式损坏、不兼容,加载时被自动跳过;
- 图像路径配置错误,仅加载了部分文件夹下的图像;
- 数据预处理时意外截断了数据集(比如误写了
x_2 = x_2[:7030]这类切片代码)。
- 误解
validation_split的逻辑:Keras的这个参数是基于传入model.fit()的实际样本数计算验证集大小的,而非你预设的原始训练集总数。输入数据的样本数不对,验证集规模自然会偏离预期。
解决方案
先确认实际样本数
在model.fit()前添加代码,核实真实的样本量:print(f"x_2的样本数: {x_2.shape[0]}") print(f"y的样本数: {y.shape[0]}")如果输出不是24977,直接聚焦数据加载环节排查问题。
检查图像加载流程
- 去原始图像文件夹统计真实有效图像数量,排除隐藏文件、损坏无法读取的图像;
- 核对加载代码(无论是用PIL、OpenCV还是Keras的
ImageDataGenerator),查看是否有跳过错误图像的逻辑,统计成功加载的图像总数; - 若使用
flow_from_directory,确认target_size、class_mode等参数配置正确,避免遗漏类别或图像。
确保输入与标签样本数一致
Keras训练前会检查x_2和y的样本数是否匹配,若不匹配会直接报错,但如果加载时部分图像对应的标签丢失,也可能出现样本数不一致的情况,需仔细核对。手动分割验证集(更稳妥)
嫌validation_split逻辑不直观的话,直接手动切分数据集,可控性更强:from sklearn.model_selection import train_test_split x_train, x_val, y_train, y_val = train_test_split(x_2, y, test_size=0.1, random_state=42) model.fit(x_train, y_train, epochs=5, validation_data=(x_val, y_val))这种方式能精准控制验证集比例,固定随机种子还能保证实验结果可复现。
内容的提问来源于stack exchange,提问作者linh dao
相关产品推荐
相关产品推荐

