You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras fit_generator开启多进程时出现RuntimeError问题求助

解决Keras fit_generator开启use_multiprocessing=True在Windows下冻结的问题

这个问题我之前在Windows环境下用Keras多进程训练时也碰到过,核心原因是Windows和Linux/macOS的多进程启动机制差异导致的,直接给你解决方案和详细解释:

直接解决方案

把你的训练相关主代码(模型构建、生成器实例化、fit_generator调用)全部包裹在if __name__ == '__main__':代码块里就可以解决这个问题。

修改前的错误示例(简化版)

# 导入库、定义生成器...

# 构建模型
model = Sequential(...)
model.compile(...)

# 启动训练(会触发错误)
model.fit_generator(generator=MyGenerator(),
                    epochs=10,
                    use_multiprocessing=True,
                    workers=4)

修改后的正确代码

from keras.models import Sequential
from keras.layers import Dense
from keras.utils import Sequence

# 自定义生成器(这部分可以放在全局,不会有问题)
class MyGenerator(Sequence):
    def __init__(self):
        # 你的初始化逻辑,比如加载数据路径等
        pass
    def __len__(self):
        # 返回总batch数
        return 100
    def __getitem__(self, idx):
        # 返回单个batch的(X, y)数据
        return (X_batch, y_batch)

# 关键:所有启动训练的代码必须放在这个判断块内
if __name__ == '__main__':
    # 构建模型
    model = Sequential()
    model.add(Dense(32, activation='relu', input_dim=10))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer='adam', loss='binary_crossentropy')

    # 启动多进程训练
    model.fit_generator(generator=MyGenerator(),
                        epochs=10,
                        use_multiprocessing=True,
                        workers=4)

为什么会出现这个错误?

错误日志里的RuntimeError已经给出了明确提示:

RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if name == 'main':

原因是:

  • Linux/macOS默认用fork方式启动子进程,会直接复制父进程的内存空间,不需要重新导入主模块
  • Windows默认用spawn方式启动子进程,会重新执行一遍主模块的代码。如果你的训练代码没有放在if __name__ == '__main__':里,子进程启动时会再次执行训练代码,导致无限创建子进程或者进程启动冲突,最终程序冻结并报错。

额外注意事项

  • 不需要添加freeze_support(),错误提示里也说明:如果程序不需要打包成可执行文件,这行代码可以省略
  • 确保所有会触发训练、创建模型的代码都在if __name__ == '__main__':块内,避免子进程重复执行这些逻辑
  • 如果你的生成器需要加载大量数据,建议在生成器的__init__里只加载数据路径,在__getitem__里按需加载,避免多进程下重复加载数据占用内存

内容的提问来源于stack exchange,提问作者Iago Quintero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:03