在本章中,讓我們編寫一個(gè)簡(jiǎn)單的基于長(zhǎng)短期記憶 (LSTM) 的 RNN 來(lái)進(jìn)行序列分析。序列是一組值,其中每個(gè)值對(duì)應(yīng)于特定的時(shí)間實(shí)例。讓我們考慮一個(gè)閱讀句子的簡(jiǎn)單示例。閱讀和理解句子包括按照給定的順序閱讀單詞并嘗試?yán)斫饨o定上下文中的每個(gè)單詞及其含義,最終以積極或消極的情緒理解句子。
這里把單詞當(dāng)作值,第一個(gè)值對(duì)應(yīng)第一個(gè)單詞,第二個(gè)值對(duì)應(yīng)第二個(gè)單詞,以此類推,并且順序會(huì)嚴(yán)格保持。序列分析在自然語(yǔ)言處理中經(jīng)常使用,以找到給定文本的情感分析。
讓我們創(chuàng)建一個(gè) LSTM 模型來(lái)分析 IMDB 電影評(píng)論并找出其正面/負(fù)面情緒。
序列分析的模型可以表示如下:
該模型的核心特征如下 :
sigmoid
激活函數(shù)組成。binary_crossentropy
作為損失函數(shù)。adam
作為優(yōu)化器。accuracy
作為指標(biā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
導(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ù)。根據(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í)間步長(zhǎng)概念添加到給定數(shù)據(jù)中。它生成長(zhǎng)度為 maxlen 的時(shí)間步長(zhǎ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è)密集層用作輸出層。
使用選定的損失函數(shù)、優(yōu)化器和指標(biāo)來(lái)編譯模型。
model.compile(loss = 'binary_crossentropy',
optimizer = 'adam', metrics = ['accuracy'])
使用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
使用測(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
更多建議: