如何保存 Keras 回归模型?

Posted

技术标签:

【中文标题】如何保存 Keras 回归模型?【英文标题】:How To Save Keras Regressor Model? 【发布时间】:2018-12-14 13:18:52 【问题描述】:

如何在训练后保存模型权重?

Keras 提供:

model.save('weights.h5')`

模型对象由build_fn属性函数初始化,如何保存?

def model():
    model = Sequential()
    model.add(Dense(10, activation='relu', input_dim=5))
    model.add(Dense(5, activation='relu'))
    model.add(Dense(1, kernel_initializer='normal'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model


if __name__ == '__main__':
`

    X, Y = process_data()

    print('Dataset Samples: '.format(len(Y)))

    model = KerasRegressor(build_fn=model,
            epochs=10,
            batch_size=10,
            verbose=1)


    kfold = KFold(n_splits=2, random_state=seed)

    results = cross_val_score(model, X, Y, cv=kfold)

    print('Results: 0.2f (1.2f MSE'.format(results.mean(), results.std()))

【问题讨论】:

【参考方案1】:

cross_val_score 克隆提供的估计器,将它们拟合到训练折叠,测试折叠得分。所以基本上,你的实际模型还没有安装。

所以首先你需要在数据上拟合模型:

model.fit(X, Y)

然后你可以使用底层的model 属性(它实际上存储了keras 模型)来调用save()save_weights() 方法。

model.model.save('saved_model.h5')

现在,当您想再次加载模型时,请执行以下操作:

from keras.models import load_model

# Instantiate the model as you please (we are not going to use this)
model2 = KerasRegressor(build_fn=model_build_fn, epochs=10, batch_size=10, verbose=1)

# This is where you load the actual saved model into new variable.
model2.model = load_model('hh.h5')

# Now you can use this to predict on new data (without fitting model2, because it uses the older saved model)
model2.predict(X)

【讨论】:

好的,感谢您的精彩回答并解决问题! 这很好用,谢谢。但是我仍然不明白为什么KerasRegressor 强制您重新创建一个新实例并将其初始化为先前训练的模型(即使不使用它,从概念上讲它违反了保存模型以持久化它的概念) . @gented 因为KerasRegressor 是由model 表示的实际keras 模型的sklearn 兼容包装器,并且模组并没有将该功能添加到包装器中。 请注意:这也适用于tf.keras.wrappers.scikit_learn.KerasClassifier

以上是关于如何保存 Keras 回归模型?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习入门,keras实现回归模型

在 tf.keras 中理解线性回归模型调优的问题

深度学习高级,Keras多输入和混合数据实现回归模型

如何使用 tensorflow 或 keras 重新训练具有新子集的线性回归模型?

使用 Keras 的简单线性回归

在回归模型中使用 Keras ImageDataGenerator