导读:

一个模型从准备数据到最后训练完成,构建了一个完整的神经网络,在准备用来预测之前,我们需要先将这个网络保存起来,以便下次可以直接拿来使用,不用重复训练。

模型的保存和调用方法为

model.save('')
model = load_model('')

我们所保存的网络状态指的是训练过程中使用的网络体系以及训练完成后网络节点之间的权重值。调用Keras中相应的保存和加载方法即可完成。

正文:

步骤1.训练最终模型

什么是最终的LSTM模型?

最终的LSTM模型是用于对新数据进行预测的模型。

也就是说,给定输入数据的新示例,您希望使用该模型来预测预期输出。这可以是分类(分配标签)或回归(实际值)。

最终形成的LSTM模型指的是训练过程中使用的网络体系以及训练完成后网络节点之间的权重值。

 

第2步。保存最终模型

Keras提供了一个API,允许您将模型保存到文件中。

该模型以HDF5文件格式保存,可有效地在磁盘上存储大量数字。您需要确认已安装h5py Python库。它可以安装如下:

在cmd中直接pip install h5py

您可以使用模型上的save()函数将适合的Keras模型保存到文件中。

# define model
model = Sequential()
model.add(LSTM(...))
# compile model
model.compile(...)
# fit model
model.fit(...)
# save model to single file
model.save('lstm_model.h5')

此单个文件将包含模型体系结构和权重。它还包括所选损失和优化算法的规范,以便您可以恢复培训。

可以使用load_model()函数再次加载模型(来自不同Python会话中的不同脚本)

from keras.models import load_model
# load model from single file
model = load_model('lstm_model.h5')
# make predictions
yhat = model.predict(X, verbose=0)
print(yhat)

下面是一个完整的LSTM模型拟合示例,将其保存到单个文件中,然后再次加载。虽然模型的加载位于同一脚本中,但此部分可以从另一个Python会话中的另一个脚本运行。运行该示例将模型保存到文件lstm_model.h5。

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from numpy import array
from keras.models import load_model

# return training data
def get_train():
seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]
seq = array(seq)
X, y = seq[:, 0], seq[:, 1]
X = X.reshape((len(X), 1, 1))
return X, y

# define model
model = Sequential()
model.add(LSTM(10, input_shape=(1,1)))
model.add(Dense(1, activation='linear'))
# compile model
model.compile(loss='mse', optimizer='adam')
# fit model
X,y = get_train()
model.fit(X, y, epochs=300, shuffle=False, verbose=0)
# save model to single file
model.save('lstm_model.h5')

# snip...
# later, perhaps run from another script

# load model from single file
model = load_model('lstm_model.h5')
# make predictions
yhat = model.predict(X, verbose=0)
print(yhat)

第3步。对新数据进行预测

在完成模型并将其保存到文件后,您可以加载它并使用它来进行预测。

例如:

  • 在序列回归问题上,这可能是下一时间步的实际值的预测。
  • 在序列分类问题上,这可能是给定输入序列的类结果。

或者它可能是基于序列预测问题细节的任何其他变化。您希望给出输入序列(X)的模型(yhat)的结果,其中序列(y)的真实结果当前是未知的。

您可能有兴趣在生产环境中进行预测,作为接口的后端或手动进行预测。这实际上取决于项目的目标。

在拟合最终模型之前对训练数据执行的任何数据准备也必须在进行预测之前应用于任何新数据。

预测是容易的部分。它涉及获取准备好的输入数据(X)并在加载的模型上调用Keras预测方法之一。

请记住,进行预测(X)的输入仅包括进行预测所需的输入序列数据,而不是所有先前的训练数据。在预测一个序列中的下一个值的情况下,输入序列将是1个样本,具有固定数量的时间步长和在定义和拟合模型时使用的特征。

例如,可以通过调用模型上的predict()函数来对输出层的激活函数的形状和比例进行原始预测:

X = ...
 model = ...
 yhat = model.predict(X)可以通过调用模型上的predict_classes()函数来预测类索引。
X = ...
 model = ...
 yhat = model.predict_classes(X)可以通过调用模型上的predict_proba()函数来预测概率。
X = ...
 model = ...
 yhat = model.predict_proba(X)

 

最终模型的保存形势又多种方式,Keras可以使用两种文件形式来保存:

  • 将模型保存为JSON。
  • 将模型保存到YAML。

具体可以参考文章链接:

https://machinelearningmastery.com/save-load-keras-deep-learning-models/