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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:43