Keras多输入自定义数据生成器训练时卡在首个Epoch无输出问题求助
问题排查与修复方案
1. 优先排查fit方法的多进程参数配置
- 如果你的
model.fit()中开启了use_multiprocessing=True或者workers>1,直接将这两个参数改为use_multiprocessing=False、workers=1验证是否恢复正常:ImageDataGenerator本身不是进程安全的,你封装的自定义生成器在多进程环境下调用
next(df_gen)时,全量数据集场景下大概率出现迭代器资源竞争导致死锁,小数据集因为迭代周期短、冲突概率低所以能正常运行。 - 如果必须使用多进程加速,不要复用全局的
df_gen实例,改为在每个worker初始化时独立创建flow_from_dataframe实例,或者直接改用tf.data.Dataset接口构建数据流。
2. 修复生成器的迭代逻辑缺陷
- 你当前用
while True + next(df_gen)的写法,旧版本Keras的flow_from_dataframe迭代器迭代完一个epoch所有样本后不会自动重置,会触发静默的迭代终止异常,外层while True捕获不到就会卡住,可修改生成器逻辑自动重置迭代器:while True: try: data_batch = next(df_gen) except StopIteration: df_gen.reset() data_batch = next(df_gen) # 后续原有处理逻辑不变
3. 校验全量数据集的关联数值列合法性
- 检查全量
train_df的number_col列是否存在缺失值、非数值类型值、超出模型输入接收范围的异常值:
你用随机数时所有值都在1-219范围内,真实数据如果存在异常值(比如0、负数、超过嵌入层输入维度的数值),会触发模型前向传播时的静默错误(Sagemaker环境默认可能关闭了异常抛出),导致流程卡住。 - 确认原始
number_col的数值全部在int32合法范围内,不存在浮点精度溢出导致的异常数值。
4. 临时定位方案
- 先把
flow_from_dataframe的shuffle参数改为True,同时将steps_per_epoch改为固定小数值比如10,验证跑10步是否正常,逐步放大步数定位触发卡死的临界数据批次,检查对应批次的number_col数值是否存在异常。
内容的提问来源于stack exchange,提问作者mempet
相关产品推荐
相关产品推荐

