首页 > 解决方案 > 如何保存包装在 sklearn 中的 keras 神经网络?

问题描述

如何保存包裹在 sklearn 模型中的神经网络?我试图将它保存为 keras 中的 h5 文件,但得到但得到以下错误“管道对象没有属性保存”。还尝试像在 sklearn 中一样保存在 pickle 文件中,但出现以下错误无法 pickle '_thread.RLock' 对象。

#Relevant Code
def create_model():
    model = Sequential()
    model.add(Dense(40, input_shape=input_shape,activation="relu"))
    model.add(BatchNormalization())
    model.add(Dense(40,activation="relu"))
    model.add(BatchNormalization())
    model.add(Dense(40,activation="relu")) 
    model.add(Dense(1))
    model.compile(loss='mean_squared_error',optimizer='Adam')
    return model

Estimator = KerasRegressor(build_fn=create_model,epochs=60,callbacks=[Early_stopping],validation_data=(X_test,y_test))

model = make_pipeline(StandardScaler(), Estimator)
input_shape=X1.shape[1:]
model.fit(X_train,y_train)

with open('Neural_network.pickle','wb') as file:
    pickle.dump(model,file)

标签: pythonkerasscikit-learn

解决方案


基于以下输出vars(model)

{'steps': [('standardscaler', StandardScaler()), ('kerasregressor', <tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor object at 0x000002570ECF6D60>)], 'memory': None, 'verbose': False}

您可以KerasRegressor从管道访问对象

kreg = model.steps['kerasregressor']

并且基于这个实现源,经过训练的 Keras 模型应该是model回归量的属性:

model = kreg.model

(我建议重命名管道对象pipeline以避免混淆。)


推荐阅读