Siamese网络训练报错TypeError: cannot pickle 'generator' object如何解决
问题解决结论
不需要继续等待,代码存在明确错误,报错TypeError: cannot pickle 'generator' object已经指出了核心问题,继续等待不会有任何进展。
错误原因
Keras/TensorFlow的model.fit()开启use_multiprocessing=True参数时,需要在主进程和子进程之间传递数据加载逻辑,Python的普通生成器带有运行时状态,无法被序列化(pickle)用于进程间通信,因此程序卡在训练初始化阶段,无法进入实际的批次训练流程。你看到的Jupyter单元格仍显示运行中,只是子进程报错后主进程未正常捕获退出信号的假死状态。
修复方案
- 最简修复:直接关闭多进程开关,将
use_multiprocessing=True改为use_multiprocessing=False,普通自定义生成器默认支持多线程加载,数据加载速度足够匹配训练速度的情况下,该方案仅需修改1行代码即可正常运行。 - 性能优化方案:如果确实需要多进程加速数据加载,将自定义生成器重写为继承
tf.keras.utils.Sequence的类,Sequence类原生支持多进程下的序列化,不会触发pickle报错,同时还能保证每个epoch的样本不会重复采样,逻辑更严谨。 - 额外优化点:当前生成器中判断负样本对是否属于正样本的逻辑使用
(p1, p2) not in list_tuples,如果正样本对量级较大,该查询是O(n)复杂度会大幅降低生成速度,建议提前将正样本对存入set结构,将查询复杂度降为O(1),提升数据生成效率。
内容的提问来源于stack exchange,提问作者NNNNNNN
相关产品推荐
相关产品推荐

