使用multiprocessing调用Keras推理时触发TypeError:numpy.ndarray不可调用
解决multiprocessing启动Keras推理进程的TypeError问题
嘿,我一下子就发现你代码里的问题啦!
错误原因
你写的这段代码:
worker_process = mp.Process(target=small_model.predict(x_test[0:1])) worker_process.start()
犯了一个很典型的错误——你直接执行了small_model.predict()方法,把它的返回值传给了Process的target参数。但multiprocessing.Process要求target必须是一个可调用的对象(比如函数、方法),而不是函数执行后的结果,这就直接触发了TypeError。
正确写法
这里给你两种可行的修正方案:
方案1:用lambda包装调用逻辑
这种方式比较简洁,适合简单场景:
worker_process = mp.Process(target=lambda: small_model.predict(x_test[0:1])) worker_process.start()
lambda表达式会把predict调用包装成一个可调用对象,传给target,子进程启动时才会执行这个推理操作。
方案2:定义独立任务函数(更推荐)
把推理逻辑封装成单独的函数,再通过args传递参数,可读性和扩展性更好:
def run_inference(model, test_data): model.predict(test_data) # 注意args是元组,哪怕只有一个参数也要加逗号 worker_process = mp.Process(target=run_inference, args=(small_model, x_test[0:1])) worker_process.start()
额外注意事项(Keras多进程坑点)
如果用TensorFlow作为Keras后端,直接在主进程创建模型再传给子进程可能会遇到序列化问题——因为TensorFlow的计算图很难跨进程传递。更稳定的做法是在子进程内部加载模型:
def run_inference(test_data): # 子进程内加载模型,避免跨进程序列化问题 from keras.models import load_model small_model = load_model("your_trained_model.h5") small_model.predict(test_data) worker_process = mp.Process(target=run_inference, args=(x_test[0:1],)) worker_process.start()
这样主进程和子进程各自维护独立的TensorFlow会话,能避免很多奇怪的报错。
内容的提问来源于stack exchange,提问作者Philip O'Brien
相关产品推荐
相关产品推荐

