Keras - Dự đoán chuỗi thời gian bằng LSTM RNN
Trong chương này, chúng ta hãy viết một RNN đơn giản dựa trên bộ nhớ dài hạn (LSTM) để phân tích trình tự. Chuỗi là một tập hợp các giá trị trong đó mỗi giá trị tương ứng với một phiên bản thời gian cụ thể. Chúng ta hãy xem xét một ví dụ đơn giản về việc đọc một câu. Đọc và hiểu một câu bao gồm việc đọc từ theo thứ tự đã cho và cố gắng hiểu từng từ và nghĩa của nó trong ngữ cảnh nhất định và cuối cùng là hiểu câu đó theo cảm xúc tích cực hoặc tiêu cực.
Ở đây, các từ được coi là giá trị và giá trị đầu tiên tương ứng với từ đầu tiên, giá trị thứ hai tương ứng với từ thứ hai, v.v. và thứ tự sẽ được duy trì nghiêm ngặt. Sequence Analysis được sử dụng thường xuyên trong xử lý ngôn ngữ tự nhiên để tìm ra phân tích tình cảm của văn bản đã cho.
Hãy để chúng tôi tạo một mô hình LSTM để phân tích các đánh giá phim IMDB và tìm ra cảm xúc tích cực / tiêu cực của nó.
Mô hình phân tích trình tự có thể được trình bày như sau:
Các tính năng cốt lõi của mô hình như sau:
Lớp đầu vào sử dụng lớp Nhúng với 128 tính năng.
Lớp đầu tiên, Dense bao gồm 128 đơn vị với số học sinh bỏ học bình thường và số học sinh bỏ học liên tục được đặt thành 0,2.
Lớp đầu ra, Dense bao gồm 1 đơn vị và chức năng kích hoạt 'sigmoid'.
Sử dụng binary_crossentropy như hàm mất mát.
Sử dụng adam như Trình tối ưu hóa.
Sử dụng accuracy dưới dạng số liệu.
Sử dụng 32 làm kích thước lô.
Sử dụng 15 làm kỷ nguyên.
Sử dụng 80 làm độ dài tối đa của từ.
Sử dụng 2000 làm số từ tối đa trong một câu nhất định.
Bước 1: Nhập các mô-đun
Hãy để chúng tôi nhập các mô-đun cần thiết.
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
Bước 2: Tải dữ liệu
Hãy để chúng tôi nhập tập dữ liệu imdb.
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 2000)
Đây,
imdblà một tập dữ liệu do Keras cung cấp. Nó đại diện cho một bộ sưu tập các bộ phim và các đánh giá của nó.
num_words đại diện cho số lượng từ tối đa trong bài đánh giá.
Bước 3: Xử lý dữ liệu
Hãy để chúng tôi thay đổi tập dữ liệu theo mô hình của chúng tôi để nó có thể được đưa vào mô hình của chúng tôi. Dữ liệu có thể được thay đổi bằng cách sử dụng mã dưới đây:
x_train = sequence.pad_sequences(x_train, maxlen=80)
x_test = sequence.pad_sequences(x_test, maxlen=80)
Đây,
sequence.pad_sequences chuyển đổi danh sách dữ liệu đầu vào với hình dạng, (data) thành mảng 2D NumPy của hình dạng (data, timesteps). Về cơ bản, nó thêm khái niệm bước thời gian vào dữ liệu đã cho. Nó tạo ra các bước thời gian dài,maxlen.
Bước 4: Tạo mô hình
Hãy để chúng tôi tạo ra mô hình thực tế.
model = Sequential()
model.add(Embedding(2000, 128))
model.add(LSTM(128, dropout = 0.2, recurrent_dropout = 0.2))
model.add(Dense(1, activation = 'sigmoid'))
Đây,
Chúng tôi vừa dùng Embedding layerlàm lớp đầu vào và sau đó thêm lớp LSTM. Cuối cùng, mộtDense layer được sử dụng như lớp đầu ra.
Bước 5: Biên dịch mô hình
Hãy để chúng tôi biên dịch mô hình bằng cách sử dụng chức năng mất mát, trình tối ưu hóa và số liệu đã chọn.
model.compile(loss = 'binary_crossentropy',
optimizer = 'adam', metrics = ['accuracy'])
Bước 6: Huấn luyện mô hình
Cho phép chúng tôi đào tạo mô hình bằng cách sử dụng fit() phương pháp.
model.fit(
x_train, y_train,
batch_size = 32,
epochs = 15,
validation_data = (x_test, y_test)
)
Việc thực thi ứng dụng sẽ xuất ra thông tin dưới đây:
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
Bước 7 - Đánh giá mô hình
Hãy để chúng tôi đánh giá mô hình bằng cách sử dụng dữ liệu thử nghiệm.
score, acc = model.evaluate(x_test, y_test, batch_size = 32)
print('Test score:', score)
print('Test accuracy:', acc)
Thực thi đoạn mã trên sẽ xuất ra thông tin bên dưới:
Test score: 1.145306069601178
Test accuracy: 0.81292