无法pickle tensorflow.python.\u tf\u stack.StackSummary对象

2024-10-10 18:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我将tensorflow从tensorflow 2.2升级到了2.4.1版,现在我无法再保存内置KerasRegressionor的sklearn管道。使用joblib.dump时,会收到以下错误消息:

TypeError: can't pickle tensorflow.python._tf_stack.StackSummary objects

如果我只是尝试对文件进行pickle,我会收到以下消息:

TypeError: can't pickle weakref objects

如果我使用dill,我会得到与使用joblib时相同的错误消息

我已尝试搜索此问题,但找不到太多帮助。我不知道StackSummary对象是什么

下面是一个独立的例子,再现了这个问题:

import numpy as np

from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
from keras.wrappers.scikit_learn import KerasRegressor


from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.compose import TransformedTargetRegressor

from joblib import dump


def create_model(lr=10**-4, first_layer_nodes=100, amsgrad_yn=0,
                 second_layer_nodes=100, third_layer_nodes=100, loss='mse',
                 Leaky_alpha_slope=1, dropout_rate=0.01, output_shape=4, cal_points=[8,9]):

    model = Sequential()
    model.add(Dense(first_layer_nodes))
    Adam = optimizers.Adam(lr=lr, amsgrad=amsgrad_yn)
    model.add(Dense(output_shape, activation='linear'))
    model.compile(optimizer=Adam, loss=loss)
 
    return model


def make_pipeline(val_split=.2, verbose=1, callbacks=[], **parameters):
    NN = KerasRegressor(build_fn=create_model, validation_split=val_split, verbose=verbose, callbacks=callbacks, **parameters) 

    scaler = StandardScaler()
    y_scaler = StandardScaler()

    NN_model_with_y_scaling = TransformedTargetRegressor(regressor=NN, transformer=y_scaler)

    pipeline = Pipeline([
        ('preprocess', scaler),
        ('NN_model', NN_model_with_y_scaling)])

    return pipeline




model = make_pipeline(val_split=.2, verbose=0, **parameters)



x_train = np.random.rand(1000, 28)
y_train = np.random.rand(1000, 4)


model.fit(x_train, y_train)

dump(model, 'test.joblib')

Tags: fromimportlayerverbosemodelpipelinetensorflowtrain