我在以下函数上调用 dask.delay,用于循环中的多个“自我”(同一类的不同对象)。
这是延迟函数,在 keras.engine.training.Model 的自定义子类中定义:
def fit(self, X: Union[pd.DataFrame, list, np.array], y=None):
if not isinstance(X, pd.DataFrame):
super().fit(X, y) # calls keras.models fit
return
df = X
X, y = self.to_supervised(df, to_train=True) # transforms df into a supervised problem
self.history = super().fit(X, y)
return self
这就是我在循环中延迟和计算函数的方式:
def fit_estimator(estimator, train_df):
return estimator.fit(train_df) #calls fit method shown previously
lazy_results = []
for mlp in mlps:
lazy_result = dask.delayed(fit_estimator)(mlp,train_df.copy())
lazy_results.append(lazy_result)
lazy_results = dask.compute(*lazy_results)
这个子类有一个名为“network”的对象属性,类型为tensorflow.python.trackable.data_structures._DictWrapper。 这个对象是可序列化的,因为 pickle.dumps 和 dask 的序列化 API 也可以序列化它。此外,整个子类的对象的序列化/反序列化工作没有任何问题。 但是,当我调用 lazy_results = dask.compute(*lazy_results) 时,会抛出错误“Exception: TypeError("can not serialize '_DictWrapper' object")”。更具体地说,返回“自我”并因此对其进行序列化是这里的问题。
如果我不在“fit”中返回“self”而是直接返回它的序列化,它工作正常,但我必须在调度程序接收到序列化对象后手动反序列化它。 我错过了什么或者这是一个错误吗?
如果我不在“fit”中返回“self”而是直接返回它的序列化,它工作正常,但我必须在调度程序接收到序列化对象后手动反序列化它。我错过了什么或者这是一个错误吗?