Я dill
автор. Я использую dill
(и klepto
) для сохранения классов, которые содержат обученные ANN внутри лямбда-функций. Я склонен использовать комбинации mystic
и sklearn
, поэтому я не могу напрямую говорить с pytorch
, но могу предположить, что он работает одинаково. Вы должны быть осторожны, если у вас есть лямбда, которая содержит указатель на объект, внешний по отношению к лямбде ... например, y = 4; f = lambda x: x+y
. Это может показаться очевидным, но dill
будет перебирать лямбду и, в зависимости от остального кода и варианта сериализации, может не сериализовать значение y
. Итак, я видел много случаев, когда люди сериализовали обученную оценку внутри некоторой функции (или лямбда-выражения, или класса), и тогда результаты не были «правильными», когда они восстанавливали функцию из сериализации. Основная причина в том, что функция не была инкапсулирована, поэтому все объекты, необходимые для получения правильных результатов, сохраняются в рассоле. Однако даже в этом случае вы можете получить «правильные» результаты обратно, но вам просто нужно создать ту же среду, которая была у вас, когда вы выбирали оценщик (т.е. все те же значения, от которых зависит окружающее пространство имен). Вывод должен быть сделан, постарайтесь убедиться, что все переменные, используемые в функции, определены внутри функции. Вот часть класса, который я недавно начал использовать сам (должен быть в следующей версии mystic
):
class Estimator(object):
"a container for a trained estimator and transform (not a pipeline)"
def __init__(self, estimator, transform):
"""a container for a trained estimator and transform
Input:
estimator: a fitted sklearn estimator
transform: a fitted sklearn transform
"""
self.estimator = estimator
self.transform = transform
self.function = lambda *x: float(self.estimator.predict(self.transform.transform(np.array(x).reshape(1,-1))).reshape(-1))
def __call__(self, *x):
"f(*x) for x of xtest and predict on fitted estimator(transform(xtest))"
import numpy as np
return self.function(*x)
Обратите внимание, когда вызывается функция, все, что она использует (включая np
) определяется в окружающем пространстве имен. Пока оценки pytorch
сериализуются, как и ожидалось (без внешних ссылок), с вами все будет в порядке, если вы будете следовать приведенным выше рекомендациям.