Keras边界框回归训练报train_test_split样本数不一致错误求解
报错根因
错误提示明确标注三个输入数组样本数不匹配:data、targets长度均为6430,但filenames长度为0。问题出在数据加载循环中,写filenames.append时没有传入要追加的参数,仅引用了列表的append方法,没有实际执行元素追加操作,导致filenames始终是空列表,无法满足数据集划分要求的数组长度一致规则。
必要代码修正
找到数据加载循环中的文件名追加行,将无参数的filenames.append修改为传入文件名参数的形式:
# 原错误写法 filenames.append # 修正后写法 filenames.append(filename)
修正后三个列表data、targets、filenames长度会保持一致,均为6430,可正常执行train_test_split划分。
非强制优化提示
以下问题不会触发当前报错,但会影响代码运行效率或最终效果,可按需调整:
- 当前逻辑是每读一行标注就加载一次对应图像,同一张图像对应多个边界框时会被重复读取、重复存入数组,大幅拖慢数据加载速度、浪费内存。可先按文件名将标注分组,每张图像仅读取一次,对应关联该图的所有边界框标签。
- 配置中定义了
PLOT_PATH用于保存训练曲线,但现有代码未编写训练过程的loss绘图逻辑,需要可视化训练效果的话可补充matplotlib绘图代码,将训练集、验证集的MSE损失变化曲线保存到对应路径。 - 训练初期冻结VGG16全部卷积层只训练回归头是合理的,等回归头收敛后,可以解冻VGG16的部分顶层卷积层,用更小的学习率做微调,能进一步提升边界框回归精度。
- 现有代码中用
cv2.imread读取图像仅为获取原始高宽做坐标归一化,实际送入模型的像素数据来自load_img(RGB通道顺序),不存在通道顺序不匹配问题,这部分逻辑无需修改。
内容的提问来源于stack exchange,提问作者Silentpig
相关产品推荐
相关产品推荐

