Keras - przewidywanie szeregów czasowych przy użyciu LSTM RNN

W tym rozdziale napiszemy prosty RNN oparty na pamięci długoterminowej (LSTM), aby przeprowadzić analizę sekwencji. Sekwencja to zestaw wartości, w których każda wartość odpowiada określonemu wystąpieniu czasu. Rozważmy prosty przykład czytania zdania. Czytanie i rozumienie zdania polega na przeczytaniu słowa w określonej kolejności i próbie zrozumienia każdego słowa i jego znaczenia w danym kontekście, a na koniec zrozumieniu zdania w pozytywnym lub negatywnym odczuciu.

Tutaj słowa są traktowane jako wartości, a pierwsza wartość odpowiada pierwszemu słowu, druga wartość odpowiada drugiemu słowu itd., A kolejność będzie ściśle zachowana. Sequence Analysis jest często używany w przetwarzaniu języka naturalnego do znalezienia analizy sentymentu danego tekstu.

Stwórzmy model LSTM, aby przeanalizować recenzje filmów IMDB i znaleźć ich pozytywne / negatywne opinie.

Model analizy sekwencji można przedstawić jak poniżej -

Podstawowe cechy modelu są następujące -

  • Warstwa wejściowa wykorzystująca warstwę osadzania z 128 funkcjami.

  • Pierwsza warstwa, Dense, składa się ze 128 jednostek z normalnym spadkiem i powtarzającym się spadkiem ustawionym na 0,2.

  • Warstwa wyjściowa, Gęsta, składa się z 1 jednostki i funkcji aktywacji „sigmoidalnej”.

  • Posługiwać się binary_crossentropy jako funkcja straty.

  • Posługiwać się adam jako optymalizator.

  • Posługiwać się accuracy jako metryki.

  • Użyj 32 jako wielkości partii.

  • Użyj 15 jako epok.

  • Użyj 80 jako maksymalnej długości słowa.

  • Użyj 2000 jako maksymalnej liczby słów w zdaniu.

Krok 1: Zaimportuj moduły

Zaimportujmy niezbędne moduły.

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

Krok 2: Załaduj dane

Zaimportujmy zestaw danych imdb.

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

Tutaj,

  • imdbto zbiór danych dostarczony przez Keras. Reprezentuje zbiór filmów i ich recenzje.

  • num_words reprezentują maksymalną liczbę słów w recenzji.

Krok 3: Przetwórz dane

Zmieńmy zbiór danych zgodnie z naszym modelem, aby można go było wprowadzić do naszego modelu. Dane można zmienić za pomocą poniższego kodu -

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

Tutaj,

sequence.pad_sequences przekonwertować listę danych wejściowych na kształt, (data) na tablicę kształtów 2D NumPy (data, timesteps). Zasadniczo dodaje koncepcję timesteps do podanych danych. Generuje timesteps długości,maxlen.

Krok 4: Utwórz model

Stwórzmy rzeczywisty model.

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

Tutaj,

Użyliśmy Embedding layerjako warstwę wejściową, a następnie dodano warstwę LSTM. Wreszcie aDense layer jest używana jako warstwa wyjściowa.

Krok 5: Skompiluj model

Skompilujmy model wykorzystując wybraną funkcję straty, optymalizator i metryki.

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

Krok 6: Wytrenuj model

L Przećwiczmy model przy użyciu fit() metoda.

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

Uruchomienie aplikacji spowoduje wyświetlenie poniższych informacji -

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

Krok 7 - Oceń model

Oceńmy model na podstawie danych testowych.

score, acc = model.evaluate(x_test, y_test, batch_size = 32) 
   
print('Test score:', score) 
print('Test accuracy:', acc)

Wykonanie powyższego kodu spowoduje wyświetlenie poniższych informacji -

Test score: 1.145306069601178 
Test accuracy: 0.81292