【问题标题】:How to save a keras neural network that is wrapped in sklearn?如何保存包装在 sklearn 中的 keras 神经网络?
【发布时间】:2020-09-22 12:22:59
【问题描述】:

如何保存包裹在 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)

【问题讨论】:

  • 你窥视过管道内部吗? print(vars(model))?
  • 是的,它只是打印管道中使用的步骤以及对象所在的位置。{'steps': [('standardscaler', StandardScaler()), ('kerasregressor', )], 'memory': None, 'verbose': False}
  • 这个issue 正好解决了你的问题。

标签: python keras scikit-learn


【解决方案1】:

基于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']

并且基于 this implementation source 训练的 Keras 模型应该是回归器上的 model 属性:

model = kreg.model

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

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 2018-09-06
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2015-06-25
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多