Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理.Pool无法pickle mxnet.mod.Module对象_Python_Mxnet - Fatal编程技术网

Python多处理.Pool无法pickle mxnet.mod.Module对象

Python多处理.Pool无法pickle mxnet.mod.Module对象,python,mxnet,Python,Mxnet,以下是我所做的大致情况: import mxnet as mx import cv2 from multiprocessing import Pool from itertools import repeat num_worker=4 CNNNet=[] img = cv2.imread('../datasets/1.jpg') sym, arg_params, aux_params = mx.model.load_checkpoint('det1', 0) for i in range(nu

以下是我所做的大致情况:

import mxnet as mx
import cv2
from multiprocessing import Pool
from itertools import repeat

num_worker=4
CNNNet=[]
img = cv2.imread('../datasets/1.jpg')
sym, arg_params, aux_params = mx.model.load_checkpoint('det1', 0)
for i in range(num_worker):
    worker_net = mx.mod.Module(symbol=sym,label_names=None)
    worker_net.bind(data_shapes=[('data', (1, 3, 1000, 1000))],for_training=False)
    worker_net.set_params(arg_params,aux_params)
    CNNNet.append(worker_net)
pool = Pool(num_worker)
threshold = 0.6
res = pool.map(do_work_warpper,zip(repeat(img),CNNNet[:num_worker],repeat(threshold)))
do\u work\u warpper()
函数是:

def do_work_warpper(args):
    return do_work(*args)
def do_work(img,net,threshold):
    #do image predict job here
    return res
当使用
mx.mod.Module
对象使用
multiprocessing.Pool
时,我在python3.6中得到了错误,这一问题让我感到困惑:

TypeError: can't pickle module objects
或者在python2.7中:

PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
PicklingError:无法pickle:属性查找\uuuu内置\uuuu。模块失败

如果您有任何建议,我们将不胜感激。

您之所以会遇到此异常,是因为
多处理
需要能够将变量传递给您的工作人员,以便在它产生的各种进程之间传递它们

错误:

TypeError: can't pickle module objects
建议传递给
池的变量之一包含模块(或具有模块作为属性的类)

要演示此问题,请查看以下两个类:

import os

class Pickable: 
    a = 1

class UnPickable:
    def __init__(self):
        self.mod = os
如果尝试pickle这两个类的实例,您将得到:

In [11]: pickle.dumps(Pickable())
Out[11]: b'\x80\x03c__main__\nPickable\nq\x00)\x81q\x01.'

In [10]: pickle.dumps(UnPickable())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-7d4d725a1c6d> in <module>()
----> 1 pickle.dumps(UnPickable())

TypeError: can't pickle module objects
[11]中的
:pickle.dumps(Pickable())
Out[11]:b'\x80\x03c\uuuuuuuuu main\uuuuuuuu\nq\x00)\x81q\x01'
在[10]中:pickle.dumps(UnPickable())
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 pickle.dumps(不可粘贴())
TypeError:无法pickle模块对象

也就是说,要么创建自己的类,模仿
mx.mod.Module
的功能,但可以序列化,要么(我认为是更好的解决方案)使用简单的python内置类型将变量传递到
池的worker中
,并在其中自行构造
mx.mod.Module
实例。

有意义的是,我将mx.mod.Module更改为python列表,并在其中自行构造,它就可以工作了。非常感谢。