Keras – 使用LSTM RNN进行时间序列预测

Keras – 使用LSTM RNN进行时间序列预测

在本章中,让我们编写一个简单的基于长短时记忆(LSTM)的RNN来做序列分析。一个序列是一组值,其中每个值都对应于一个特定的时间实例。让我们考虑一个简单的例子:阅读一个句子。阅读和理解一个句子包括按照给定的顺序阅读单词,并试图理解每个单词及其在给定语境中的含义,最后以积极或消极的情绪理解该句子。

在这里,单词被视为值,第一个值对应于第一个单词,第二个值对应于第二个单词,等等,而且顺序将被严格保持。 序列分析 在自然语言处理中经常被用来寻找给定文本的情感分析。

让我们创建一个LSTM模型来分析IMDB的电影评论,并找到其积极/消极的情绪。

序列分析的模型可以表示如下

Keras - 使用LSTM RNN进行时间序列预测

该模型的核心特征如下—

  • 输入层使用嵌入层,有128个特征。

  • 第一层,Dense由128个单元组成,正常落差和递归落差设置为0.2。

  • 输出层, Dense 由1个单元和 “sigmoid “激活函数组成。

  • 使用 binary_crossentropy 作为损失函数。

  • 使用 adam 作为优化器。

  • 使用 准确性 作为衡量标准。

  • 使用32作为批次大小。

  • 使用15次作为epochs。

  • 使用80作为单词的最大长度。

  • 使用2000作为一个给定句子中的最大单词数。

第1步:导入模块

让我们导入必要的模块。

from keras.preprocessing import sequence 
from keras.models import Sequential 
from keras.layers import Dense, Embedding 
from keras.layers import LSTM 
from keras.datasets import imdb

第2步:加载数据

让我们导入imdb数据集。

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 2000)

这里、

  • imdb 是一个由Keras提供的数据集。它代表了一个电影及其评论的集合。

  • num_words 代表评论中的最大字数。

第3步:处理数据

让我们根据我们的模型来改变数据集,这样它就可以被送入我们的模型。数据可以用下面的代码来改变 —

x_train = sequence.pad_sequences(x_train, maxlen=80) 
x_test = sequence.pad_sequences(x_test, maxlen=80)

这里、

sequence.pad_sequences 将形状为 (data) 的输入数据列表转换成形状为 (data, timesteps) 的二维NumPy数组 基本上,它在给定的数据中加入时间段的概念。它生成了长度为 maxlen 的时间段

第4步:创建模型

让我们来创建实际的模型。

model = Sequential() 
model.add(Embedding(2000, 128)) 
model.add(LSTM(128, dropout = 0.2, recurrent_dropout = 0.2)) 
model.add(Dense(1, activation = 'sigmoid'))

这里、

我们使用 嵌入 层作为输入层,然后加入LSTM层。最后, 密集层 被用作输出层。

第5步:编译模型

让我们使用选定的损失函数、优化器和度量标准来编译该模型。

model.compile(loss = 'binary_crossentropy', 
   optimizer = 'adam', metrics = ['accuracy'])

第6步:训练模型

让我们使用 fit() 方法训练模型。

model.fit(
   x_train, y_train, 
   batch_size = 32, 
   epochs = 15, 
   validation_data = (x_test, y_test)
)

执行应用程序将输出以下信息—

Epoch 1/15 2019-09-24 01:19:01.151247: I 
tensorflow/core/platform/cpu_feature_guard.cc:142] 
Your CPU supports instructions that this 
TensorFlow binary was not co mpiled to use: AVX2 
25000/25000 [==============================] - 101s 4ms/step - loss: 0.4707 
- acc: 0.7716 - val_loss: 0.3769 - val_acc: 0.8349 Epoch 2/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.3058 
- acc: 0.8756 - val_loss: 0.3763 - val_acc: 0.8350 Epoch 3/15 
25000/25000 [==============================] - 91s 4ms/step - loss: 0.2100 
- acc: 0.9178 - val_loss: 0.5065 - val_acc: 0.8110 Epoch 4/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.1394 
- acc: 0.9495 - val_loss: 0.6046 - val_acc: 0.8146 Epoch 5/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0973 
- acc: 0.9652 - val_loss: 0.5969 - val_acc: 0.8147 Epoch 6/15 
25000/25000 [==============================] - 98s 4ms/step - loss: 0.0759 
- acc: 0.9730 - val_loss: 0.6368 - val_acc: 0.8208 Epoch 7/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0578 
- acc: 0.9811 - val_loss: 0.6657 - val_acc: 0.8184 Epoch 8/15 
25000/25000 [==============================] - 97s 4ms/step - loss: 0.0448 
- acc: 0.9850 - val_loss: 0.7452 - val_acc: 0.8136 Epoch 9/15 
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0324 
- acc: 0.9894 - val_loss: 0.7616 - val_acc: 0.8162Epoch 10/15 
25000/25000 [==============================] - 100s 4ms/step - loss: 0.0247 
- acc: 0.9922 - val_loss: 0.9654 - val_acc: 0.8148 Epoch 11/15 
25000/25000 [==============================] - 99s 4ms/step - loss: 0.0169 
- acc: 0.9946 - val_loss: 1.0013 - val_acc: 0.8104 Epoch 12/15 
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0154 
- acc: 0.9948 - val_loss: 1.0316 - val_acc: 0.8100 Epoch 13/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0113 
- acc: 0.9963 - val_loss: 1.1138 - val_acc: 0.8108 Epoch 14/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0106 
- acc: 0.9971 - val_loss: 1.0538 - val_acc: 0.8102 Epoch 15/15 
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0090 
- acc: 0.9972 - val_loss: 1.1453 - val_acc: 0.8129 
25000/25000 [==============================] - 10s 390us/step

第7步 – 评估模型

让我们使用测试数据来评估该模型。

score, acc = model.evaluate(x_test, y_test, batch_size = 32) 

print('Test score:', score) 
print('Test accuracy:', acc)

执行上述代码将输出以下信息—

Test score: 1.145306069601178 
Test accuracy: 0.81292

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程