我的错误类似于发布的很多问题,但没有一个真正解决了我的问题。
所以,我试图使用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 dumppickle.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都会引发很多问题。
由于
答案 0 :(得分:0)
在深入研究类中存在的所有变量之后,由
引用print(self.__dict__)
我意识到它的2个变量是生成器对象,这导致了问题。它是自定义的 range()函数,它采用生成生成器对象的浮动步骤。
这是一个非常奇怪的错误,现在我用
替换了它np.arange(start, end, step)
它的工作就像一个魅力