TypeError:不能为非生成器方法挑选生成器对象

时间:2016-11-09 05:45:49

标签: python-3.x methods generator pickle joblib

我的错误类似于发布的很多问题,但没有一个真正解决了我的问题。

所以,我试图使用joblib的Parallel& amp;延迟进行并行处理,以及我想要使用它的功能,在酸洗时会引发错误。我面临以下错误:

TypeError: can't pickle generator objects

现在,函数定义如下:

def checkProcess(self, param_set, x_train, y_train, x_test, y_test, scores):
    t1 = dt.datetime.now()

    self.__wrapper__(**param_set)

    self.train_estimator(x_train, y_train)

    predictions = self.generate_predictions(x_test)

    score = self.generate_scores(predictions, y_test)

    key = self.generate_key_from_dictionary(param_set)

    scores[key] = score

    if self.verbose:
        print("Fitted Parameters {}. Total time {} seconds".format(list(param_set.items()),
                                                                                    (
                                                                                    dt.datetime.now() - t1).total_seconds()))

而且,由于早期错误来自joblib中的延迟功能,我尝试手动酸洗:

pickle.dumps(self.checkProcess)

引发了同样的错误。然后我尝试检查天气,方法是生成器(显然不是)使用:

import inspect
print(inspect.isgeneratorfunction(self.checkProcess))

并按预期返回 False

现在,类名为 CrossValidation ,绑定了 checkProcess 方法。我尝试使用

进行pickle dump
pickle.dumps(CrossValidation.checkProcess)

并且它工作得很好,因此我尝试使用:

进行延迟()调用
Parallel(n_jobs=self.n_jobs, verbose=1)(delayed(CrossValidation.checkProcess, check_pickle=False)(param_set, x_train, y_train, x_test, y_test, scores) for param_set in param_combinations)

然后缺少位置参数 self ,由于参数的数量不相同而引起错误。

为了解决这个问题,我使用以下方法手动发送 self 作为参数

Parallel(n_jobs=self.n_jobs, verbose=1)(delayed(CrossValidation.checkProcess, check_pickle=False)(self, param_set, x_train, y_train, x_test, y_test, scores) for param_set in param_combinations)

然而,这让我回到了我在开始时提到的同样的错误。

我的想法是函数 self.generate_key_from_dictionary(param_set)返回一个元组。哪个可能被认为是生成器,因此尝试评论这两个语句并重新运行,但问题仍然存在。

我希望这个问题不重复,任何帮助都会受到重视,因为无论我如何实施,Parallel都会引发很多问题。

由于

1 个答案:

答案 0 :(得分:0)

在深入研究类中存在的所有变量之后,由

引用
print(self.__dict__)

我意识到它的2个变量是生成器对象,这导致了问题。它是自定义的 range()函数,它采用生成生成器对象的浮动步骤。

这是一个非常奇怪的错误,现在我用

替换了它
np.arange(start, end, step)

它的工作就像一个魅力