邵洲作者

如何用LSTMs做预测?(附代码)| 博士带你学LSTM

本文的作者对此书进行了翻译整理之后,分享给大家,本文是第十三期内容。

第一期内容为:一万字纯干货|机器学习博士手把手教你入门LSTM(附代码资料)

第二期内容为:干货推荐|如何基于时间的反向传播算法来训练LSTMs?

第三期内容为:干货推荐|如何准备用于LSTM模型的数据并进行序列预测?(附代码)

第四期内容为:机器学习博士带你入门|一文学会如何在Keras中开发LSTMs(附代码)

第五期内容为:初学者如何避免在序列预测问题中遇到的陷阱?

第六期内容为:如何开发和评估Vanilla LSTM模型?

第七期内容为:博士带你学LSTM|怎么样开发Stacked LSTMs?(附代码)

第八期内容为:博士带你学LSTM|手把手教你开发CNN LSTM模型,并应用在Keras中(附代码)

第九期内容为:博士带你学LSTM|开发Encoder-Decoder LSTM模型的简单教程(附代码)

第十期内容为:博士带你学LSTM|开发Bidirectional LSTM模型的简单教程(附代码)

第十一期内容为:博士带你学LSTM|怎么开发一个LSTM模型来生成形状?(附代码)

第十二期内容为:博士带你学LSTM|如何使用学习曲线来诊断你的LSTM模型的行为?(附代码)

我们还将继续推出一系列的文章来介绍里面的详细内容,和大家一起来共同学习。

13.0 前言

13.0.1 课程目标

本课程的目标是学习怎么样完成一个LSTM模型,并用它在新数据上做预测。完成本课的学习之后,你将会学习到:

  • 怎么样为你的工程开发一个最终的LSTM模型;

  • 怎么样将LSTM模型保存到文件以便后面使用;

  • 怎么样在新的数据上加载LSTM模型来做预测。

13.0.2 课程概览

本课程分为三个部分,它们是:

  1. 什么是最终LSTM模型;

  2. 将LSTM模型保存到文件;

  3. 在新数据上做预测。

让我们开始吧!

13.1 完成一个LSTM模型

在本节中,你将会学习到怎么样去完成你的LSTM模型。

13.1.1 什么是一个最终LSTM模型?

在本章节中,你将会发现怎么样定型你的LSTM模型。

最后一个LSTM模型是用来预测新数据的模型。也就是说,给定输入数据的新示例,你希望在使用该模型来预测预期输出。这可以是一个分类(指定一个标签)或一个回归(一个实值)。你的序列预测项目的目标达到一个最好的模型,其中最好的定义是:

  • 数据:你可用的历史数据;

  • 时间:工程上你必须花费的时间;

  • 过程:数据准备步骤,算法,以及所选择的算法配置;

在你的工程中,你将数据聚在一起,花费你的时间,并发现数据准备过程,使用的算法,以及如何配置它。这个模型是这个过程的顶点,你寻找的目的是为了开始实际的预测。没有完美的模型。你能够发现的只有最好的模型。

13.1.2 使用训练或测试集的目的

创建你数据集的训练和测试拆分是一种快速评估算法对问题性能的方法。训练数据集被用来准备模型,训练它。我们假设测试数据集是新的数据,其中输出值从算法中被保留。我们从训练模型中手机来自测试数据集测输入的预测,并将它们与测试集的保留输出值进行比较。

将测试与预测数据集中的保留输出进行比较,使我们能够在测试数据集上计算模型的性能度量。这是在对未知数据进行预测时对为进行训练的算法的技巧的估计。使用K折交叉验证是一种更稳健和更昂贵的计算方法。我们使用我们在训练数据集上的LSTM模型技能的估计作为代理来估计在新的数据集上做预测时,模型的技能会是什么样的。

这是一个相当大的飞跃,需要:

  • 你所使用的程序是非常稳健的,技能的估计接近我们对未知数据的实际期望;

  • 性能测量的选择准确地捕获了我们对未知数据的预测感兴趣的测量;

  • 数据准备的选择在新数据上是很好理解的并且可重复的,如果预测需要返回到其原始规模或与原始输入值相关则并且是可逆的;

  • 模型架构和配置的选择对于其预期使用和操作环境(例如复杂性)是有意义的。

很多骑上在测试集或k折交叉验证程序的整个过程的估计技能。

13.1.3 怎么样最终化LSTM模型?

通过在所有数据上应用所选择的LSTM体系结构和配置来完成模型。没有训练和测试分割,没有交叉验证折叠。把所有的数据重新组合到一个大的训练数据集中,并拟合你的模型。就是这样。用最终的模型,你可以:

  • 保存模型用于以后或操作使用;

  • 加载模型并对新数据进行预测。

为什么不保持最好的训练模式呢?

你的LSTM模型可能需要数天或者数周来准备。在这种情况下,你可能希望将模型保持在训练数据集上,而不是需要在训练和测试集的组合上。这是对附加数据进行模型训练的可能条件和用于拟合新模型的时间和计算成本之间的权衡。

最终模型上的性能会不一样吗?

使用鲁棒的测试线束的全部想法是估计最终模型的技能。理想情况下,估计与最终模型中观察到的技能之间的差异在测量误差点上是次要的,或者技能被提升为用于弄下的训练实例的数量的函数。你可以通过对模型技能与训练实例的数量进行敏感性分析来测试这两个假设。

每次训练的最后模式不会不同吗?

你用来选择最终模型的技能估计应该在多次运行中进行平均。这样,你知道,平均所选的模型架构和配置是熟练的。你可以尝试通过训练多个最终模型和在实践中使用它们的预测的集合或平均来控制模型的随机性质。同样,你可以设计一个灵敏度分析来测试这是否会导致一组更稳定的预测。

13.2 把LSTM模型保存到文件

Keras提供了一个API来允许你将你的模型保存为文件。有两个选项:

  1. 将模型保存为一个单一的文件;

  2. 将模型的结构和权重分开保存为文件。

在这两种情况下,使用HDF5文件格式来在磁盘上大量存储大量的数字。你需要确认你安装了h5py的Python库。可以安装如下:

  1. sudo pip install h5py

表 13.1 安装所需的h5py Python库

13.2.1 保存为单一文件

你可以使用模型的save()函数保存一个拟合的Keras模型到文件。例如:

  1. # define model model = Sequential()

  2. model.add(LSTM(...))

  3. # compile model

  4. model.compile(...)

  5. # fit model

  6. model.fit(...)

  7. # save model to single file

  8. model.save( 'lstm_model.h5' )

表 13.2 保存拟合LSTM模型到一个单一文件的例子

这个单一文件包含模型结构和权重。它还包括制定的损失和优化算法的规范,以便你可以恢复训练。该模型可以使用load_model()函数来再次加载(来自于不同的Python会话中的不同脚本)。

  1. from keras.models import load_model

  2. # load model from single file

  3. model = load_model( 'lstm_model.h5' )

  4. # make predictions

  5. yhat = model.predict(X, verbose=0)

  6. print(yhat)

表 13.3 从单一文件中加载一个保存了的LSTM模型的例子

下面是一个完整的LSTM模型的例子,将它保存到一个文件中,然后加载它。虽然模型的加载在同一个脚本中,但是这个部分可以从另一个Python会话中的另一个脚本运行。运行例子将模型保存到文件lstm_model.h5文件中。

  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from numpy import array

  5. from keras.models import load_model

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((len(X), 1, 1))

  12. return X, y

  13. # define model

  14. model = Sequential()

  15. model.add(LSTM(10, input_shape=(1,1)))

  16. model.add(Dense(1, activation= 'linear' ))

  17. # compile model

  18. model.compile(loss= 'mse' , optimizer= 'adam' )

  19. # fit model

  20. X,y = get_train()

  21. model.fit(X, y, epochs=300, shuffle=False, verbose=0)

  22. # save model to single file

  23. model.save( 'lstm_model.h5' )

  24. # snip...

  25. # later, perhaps run from another script

  26. # load model from single file

  27. model = load_model( 'lstm_model.h5' )

  28. # make predictions

  29. yhat = model.predict(X, verbose=0)

  30. print(yhat)

表 13.4 保存一个拟合的LSTM模型到一个单一的文件并稍后再次加载它的例子

13.2.2 保存到分开的文件

你可以保存模型的结构(例如,层和它们间是如何连接的)和权重(数字的数组)到分别的文件中。我推荐这种方法,因为它允许你开发更新的模型权重并替换一个模型,同时确保模型的结构保持不变。

保存结构

Keras提供了两种保存模型结构的格式:JSON和YAML格式。这些格式的好处是它们是人类可读的。选择实际上是一个口味和偏好的问题。可以调用tojson()或者toyaml()函数来将你的模型分别保存为JSON或者YAML格式的文件。它们返回一个标准的字符串,你可以使用标准的Python文件open()和write()函数将这个字符串保存为一个ASCII文件到硬盘。

  1. ...

  2. # convert model architecture to JSON format

  3. architecture = model.to_json()

  4. # save architecture to JSON file

  5. with open( 'architecture.json' , 'wt' ) as json_file:

  6. json_file.write(architecture)

表 13.5 保存一个拟合LSTM模型结构到文件的例子

使用 modelfromjson()或者 modelfromyaml()函数,模型结构可以被再次加载(在不同的Python会话中从不同的脚本加载)。一旦加载,modelfromjson()或者 modelfromyaml()函数可以被用作从结构中产生一个Keras模型。

  1. from keras.models import model_from_json

  2. # load architecture from JSON File

  3. json_file = open( architecture.json , rt )

  4. architecture =

  5. json_file.read()

  6. json_file.close()

  7. # create model from architecture

  8. model = model_from_json(architecture)

表 13.6 从文件中加载一个保存了的LSTM模型结构的例子

保存权重

Keras提供了一个函数在拟合模型上保存模型权重。save_weights()函数将会保存模型权重到HDF5格式文件。

  1. ...

  2. # save weights to hdf5 file

  3. model.save_weights( 'weights.h5' )

表 13.7 保存一个拟合了的LSTM模型权重到文件的例子

模型权重可以被再次加载(在不同脚本的不同的Python会话中使用load_weights()函数来加载模型对象)。这意味着你必须依据有了一个模型,要么重新创建,要么从加载的结构创建。

  1. ...

  2. # save weights to hdf5 file

  3. model.load_weights( 'weights.h5' )

表 13.8 从文件中加载一个保存了的LSTM模型权重的例子

例子

我们可以把它们组合成一个单独工作的例子。下面的演示合适于一个小型的数据集上的LSTM模型。模型结构采用JSON格式保存,模型权值以HDF5格式存储。如果你愿意,可以很容易地更改例子以保存为YAML格式的结构。然后从这些文件中加载模型并进行预测。

  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from numpy import array

  5. from keras.models import model_from_json

  6. import os

  7. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

  8. # return training data

  9. def get_train():

  10. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  11. seq = array(seq)

  12. X, y = seq[:, 0], seq[:, 1]

  13. X = X.reshape((len(X), 1, 1))

  14. return X, y

  15. # define model

  16. model = Sequential()

  17. model.add(LSTM(10, input_shape=(1,1)))

  18. model.add(Dense(1, activation= 'linear' ))

  19. # compile model

  20. model.compile(loss= 'mse' , optimizer= 'adam' )

  21. # fit model

  22. X,y = get_train()

  23. model.fit(X, y, epochs=300, shuffle=False, verbose=0)

  24. # convert model architecture to JSON format

  25. architecture = model.to_json()

  26. # save architecture to JSON file

  27. with open( 'architecture.json' , 'wt' ) as json_file:

  28. json_file.write(architecture)

  29. # save weights to hdf5 file

  30. model.save_weights( 'weights.h5' )

  31. # snip...

  32. # later, perhaps run from another script

  33. # load architecture from JSON File

  34. json_file = open( 'architecture.json' , 'rt' )

  35. architecture = json_file.read()

  36. json_file.close()

  37. # create model from architecture

  38. model = model_from_json(architecture)

  39. # load weights from hdf5 file

  40. model.load_weights( 'weights.h5' )

  41. # make predictions

  42. yhat = model.predict(X, verbose=0)

  43. print(yhat)

表 13.9 保存一个拟合LSTM模型到分别的文件并稍后再次加载它的例子

运行这个例子保存模型结构到architecture.json文件并保存权重到weights.h5文件。然后从这些相同的文件加载模型。虽然模型加载在同一个脚本中演示,但是也可以在另外另外一个脚本文件的一个Python会话中轻松地运行该段脚本。

13.3 在新数据上做预测

在进行预测之前,对你的训练数据进行任何数据准备也必须应用于任何新的数据。例如,如果你的训练数据被标准化,那么所有你希望预测的新数据也必须被规范化。反过来,这意味着,用于规范数据(例如,最大值和最小值)的稀疏必须保存为模型化的一部分,并在需要预测时加载。

这适用于其他形式的数据准备,例如对数变换、标准化值和使系列平稳。原始数据被转换成其矢量化形式的特定方式也必须被复制。这包括序列的填充或截断,并且重要的是,将原始序列整形成样本的3D格式、时间步长和特征。

根据问题的框架,预测时的样本数可以指输入输出序列的数量,以便于输出预测。对于单个预测,它可能是1。想想所有在将原始数据转换成用于训练作为管道的模型的数据时所做的数据准备。这个管道也必须在任何时候进行预测。

13.3.2 预测值

预测是很容易的一部分。我们在第4张中介绍了基本API,但是我们将更加详细地复习它。它包括将准备好的输入数据(X)和调用Keras预测方法之一加载模型。记住,用于预测(X)的输入仅由预测所需的输入序列数组成,而不是所有先前的训练数据。在预测一个序列中的下一个值的情况下,输入序列将是1个样本,具有固定的时间步长和在定义和拟合模型时使用的特征。

例如,在输出层的激活函数的形状和尺度上的原始预测可以通过调用模型上的predict()函数来实现:

  1. X = ...

  2. model = ...

  3. yhat = model.predict(X)

表 13.10 在新数据上用一个拟合的LSTM模型做预测的例子

预测一个类的索引可以通过在模型上调用predict_classes()函数实现。

  1. X = ...

  2. model = ...

  3. yhat = model.predict_classes(X)

表 13.11 在新数据上用一个拟合的LSTM模型预测分类的例子

预测可能性可以通过在模型上调用predict_proba()函数来实现。

  1. X = ...

  2. model = ...

  3. yhat = model.predict_proba(X)

表 13.12 在新数据上用一个拟合LSTM预测可能性的例子

13.4 扩展阅读

13.4.1 API

  • How can I save a Keras model? in the Keras FAQ.

  • Save and Load Keras API.

13.5 扩展

你想更深入地学习一个完成LSTM模型吗?本章节列出了本课程中的一些有挑战性的扩展:

  • 列出一个或多个预测问题,在这里你想开发一个LSTM模型并保存它用于以后的预测中;

  • 从书中的模型部分更新一个例子,以将模型保存到多个文件中,然后再次从另外一个脚本加载并进行预测;

  • 从书中的模型部分更新一个示例,用一个分类输出来预测概率,并以图形方式呈现概率;

  • 从书中的模型部分更新一个示例,使用一个分类输出来使用predict()函数,然后使用argmax()函数来将结果解释为类值;

  • 从书中模型部分选择一个例子,通过聚焦模型结构(例如,层数、存储单元等)来调优性能。你可能需要增加问题的难度。

  • 从书中模型部分选择一个例子,并通过关注模型行为(例如,周期数、训练例子、批次等)来调整性能。你可能需要增加这个问题的难度。

13.6 总结

在本章节中你学习到了在更新你的最终化的LSTM模型中充分利用新数据。特别地,你学习到了:

  • 怎么样为你的工程开发一个最终的LSTM模型;

  • 怎么样将LSTM模型保存到文件以便后面使用;

  • 怎么样在新的数据上加载LSTM模型来做预测。

在下面的课程中,你将会学习到怎么样更新一个完成的LSTM模型来充分利用新数据。

AMiner学术头条
AMiner学术头条

AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。系统2006年上线,吸引了全球220个国家/地区800多万独立IP访问,数据下载量230万次,年度访问量1000万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。

https://www.aminer.cn/
专栏二维码
工程LSTM
6
相关数据
范数技术

范数(norm),是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,是一个函数,其为向量空间内的所有向量赋予非零的正长度或大小。半范数反而可以为非零的向量赋予零长度。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

学习曲线技术

在机器学习领域,学习曲线通常是表现学习准确率随着训练次数/时长/数据量的增长而变化的曲线

反向传播算法技术

反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法计算对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。 在神经网络上执行梯度下降法的主要算法。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。

规范化技术

规范化:将属性数据按比例缩放,使之落入一个小的特定区间,如-1.0 到1.0 或0.0 到1.0。 通过将属性数据按比例缩放,使之落入一个小的特定区间,如0.0到1.0,对属性规范化。对于距离度量分类算法,如涉及神经网络或诸如最临近分类和聚类的分类算法,规范化特别有用。如果使用神经网络后向传播算法进行分类挖掘,对于训练样本属性输入值规范化将有助于加快学习阶段的速度。对于基于距离的方法,规范化可以帮助防止具有较大初始值域的属性与具有较小初始值域的属相相比,权重过大。有许多数据规范化的方法,包括最小-最大规范化、z-score规范化和按小数定标规范化。

敏感性分析技术

敏感性分析是研究数学模型或系统的输出的不确定性(数值或其他)如何能够分配到输入中不同的不确定性来源

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

批次技术

模型训练的一次迭代(即一次梯度更新)中使用的样本集。

推荐文章
暂无评论
暂无评论~