Keras 使用 LSTM RNN 進(jìn)行時(shí)間序列預(yù)測(cè)

2021-10-15 15:11 更新

在本章中,讓我們編寫一個(gè)簡單的基于長短期記憶 (LSTM) 的 RNN 來進(jìn)行序列分析。序列是一組值,其中每個(gè)值對(duì)應(yīng)于特定的時(shí)間實(shí)例。讓我們考慮一個(gè)閱讀句子的簡單示例。閱讀和理解句子包括按照給定的順序閱讀單詞并嘗試?yán)斫饨o定上下文中的每個(gè)單詞及其含義,最終以積極或消極的情緒理解句子。

這里把單詞當(dāng)作值,第一個(gè)值對(duì)應(yīng)第一個(gè)單詞,第二個(gè)值對(duì)應(yīng)第二個(gè)單詞,以此類推,并且順序會(huì)嚴(yán)格保持。序列分析在自然語言處理中經(jīng)常使用,以找到給定文本的情感分析。

讓我們創(chuàng)建一個(gè) LSTM 模型來分析 IMDB 電影評(píng)論并找出其正面/負(fù)面情緒。

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

該模型的核心特征如下 :

  • 使用具有 128 個(gè)特征的嵌入層的輸入層。
  • 第一層,Dense 由 128 個(gè)單元組成,正常 dropout 和 recurrent dropout 設(shè)置為 0.2。
  • 輸出層,Dense由 1 個(gè)單元和 sigmoid激活函數(shù)組成。
  • 使用 binary_crossentropy 作為損失函數(shù)。
  • 使用 adam 作為優(yōu)化器。
  • 使用 accuracy 作為指標(biāo)。
  • 使用 32 作為批量大小。
  • 使用 15 作為紀(jì)元。
  • 使用 80 作為單詞的最大長度。
  • 使用 2000 作為給定句子中的最大單詞數(shù)。

第 1 步:導(dǎo)入模塊

導(dǎo)入必要的模塊。

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 步:加載數(shù)據(jù)

導(dǎo)入 imdb 數(shù)據(jù)集。

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 2000)
  • imdb 是 Keras 提供的數(shù)據(jù)集。它代表了一系列電影及其評(píng)論。
  • num_words 表示評(píng)論中的最大單詞數(shù)。

第 3 步:處理數(shù)據(jù)

根據(jù)我們的模型更改數(shù)據(jù)集,以便將其輸入到我們的模型中??梢允褂靡韵麓a更改數(shù)據(jù):

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

sequence.pad_sequences 將具有形狀(data)的輸入數(shù)據(jù)列表轉(zhuǎn)換為形狀(data, timesteps) 的二維 NumPy 數(shù)組?;旧?,它將時(shí)間步長概念添加到給定數(shù)據(jù)中。它生成長度為 maxlen 的時(shí)間步長。

第 4 步:創(chuàng)建模型

創(chuàng)建實(shí)際模型。

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 層。最后,一個(gè)密集層用作輸出層。

第 5 步:編譯模型

使用選定的損失函數(shù)、優(yōu)化器和指標(biāo)來編譯模型。

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

第 6 步:訓(xùn)練模型

使用fit()方法訓(xùn)練模型。

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

執(zhí)行應(yīng)用程序?qū)⑤敵鲆韵滦畔?

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 步 - 評(píng)估模型

使用測(cè)試數(shù)據(jù)評(píng)估模型。

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

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

執(zhí)行上述代碼將輸出以下信息 :

Test score: 1.145306069601178
Test accuracy: 0.81292
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)