2016-11-09 10 views
0

Моя ошибка похожа на массу вопросов, опубликованных, но ни одна из них не решила мою проблему.ТипError: не может разжечь объекты генератора для методов Non Generator

Итак, я пытался использовать параметр joblib Parallel &, отложенный для выполнения параллельной обработки, и функция, которую я хочу использовать, вызывает ошибку при травлении. Я сталкиваюсь следующее сообщение об ошибке:

TypeError: can't pickle generator objects 

Теперь функция Defination выглядит следующим образом:

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)) 

И это возвращает ложных, как и ожидалось.

Теперь имя класса Перекрёстная Проверка, для которых метод checkProcess обязан. Я попытался рассол дамп с помощью

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) 

Тогда позиционного аргумент самого отсутствовало, что поднятые ошибки в количество аргументов не одинаково.

Чтобы преодолеть это, я вручную послал себя в качестве параметра с помощью:

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) возвращает кортеж. Что может быть выведено как генератор, и, следовательно, попытался прокомментировать эти 2 заявления и снова запустить, но проблема все еще сохраняется.

Надеюсь, что вопрос не дублируется, и любая помощь будет оценена по достоинству, поскольку Parallel вызывает много проблем независимо от того, как я реализую.

Благодаря

ответ

0

После долгих рыть во всех переменных, присутствующих в классе, на которые ссылается

print(self.__dict__) 

я понял, что его 2 переменные были объектами генератор, который вызывают проблемы. Это была обычная функция range() Функция, которая принимает плавающие шаги, генерирующие объект генератора.

Это было действительно странно ошибка, и теперь я заменил, что с

np.arange(start, end, step) 

и его работы как шарм

 Смежные вопросы

  • Нет связанных вопросов^_^