Keras单目深度估计代码调用next()触发StopIteration错误如何修复
StopIteration错误排查修复方案
这个错误的本质是你构造的DataGenerator迭代器首次取数时就没有可用数据返回,按照以下步骤排查即可:
1. 检查数据集基础参数
- 先执行
print(len(df))确认数据集总样本数,必须满足总样本数 ≥ 当前设置的batch_size=6,如果样本数小于6,迭代器第一次取数就会直接触发空迭代报错 - 检查
HEIGHT、WIDTH参数是否和数据集图片的尺寸要求匹配,有没有因为尺寸校验过滤掉了全部样本,导致实际可用样本数为0 - 确认
DataGenerator的__len__方法实现是否正确,标准实现应该返回总批次数量,返回值≤0就会直接终止迭代
2. 检查DataGenerator核心逻辑
- 确认
__getitem__方法中是否添加了非法数据过滤逻辑,比如图片读取失败直接跳过的规则,如果过滤后当前批次没有可用数据,也会间接触发空迭代报错 - 确认索引取值范围是否合法,有没有出现索引超出
len(df)范围的逻辑,导致取不到有效样本
3. 临时验证方法
你可以先把batch_size改成1测试是否能正常返回数据,如果修改后运行正常,就能确认是数据集总样本数不足以支撑batch_size=6的要求:
# 测试生成器可用性 test_gen = DataGenerator(data=df, batch_size=1, dim=(HEIGHT, WIDTH)) print("生成器总批次:", len(test_gen)) print("单批次样本:", next(iter(test_gen)))
4. 对应修复方案
- 如果是数据集样本数不足:要么扩充数据集到至少6条,要么把batch_size调整为小于等于总样本数的值,同时要把
visualize_depth_map函数中循环的range(6)修改为对应batch_size的大小,避免后续索引越界 - 如果是
__len__方法实现错误,修正为标准写法即可:
import math def __len__(self): return math.ceil(len(self.data) / self.batch_size)
- 如果是数据过滤逻辑导致空批次:要么放宽过滤校验规则,要么添加补全逻辑,当过滤后样本不足时自动补全重复样本凑够batch_size大小
内容的提问来源于stack exchange,提问作者be_real
相关产品推荐
相关产品推荐

