Mạng thần kinh tái phát (RNNs) được thiết kế để tìm hiểu dữ liệu chuỗi. Như bạn đoán, họ chắc chắn có thể lấy nhiều tính năng làm đầu vào! Các RNN của Keras lấy đầu vào 2D ( T , F ) của dấu thời gian T và tính năng F (Tôi bỏ qua kích thước lô ở đây).
Tuy nhiên, bạn không phải lúc nào cũng cần hoặc muốn các dấu thời gian trung gian, t = 1, 2 ... ( T - 1). Do đó, Keras linh hoạt hỗ trợ cả hai chế độ. Để có đầu ra tất cả các dấu thời gian T , hãy chuyển return_sequences=True
đến RNN của bạn (ví dụ: LSTM
hoặc GRU
) khi xây dựng. Nếu bạn chỉ muốn dấu thời gian cuối cùng t = T , thì hãy sử dụng return_sequences=False
(đây là mặc định nếu bạn không chuyển return_sequences
cho hàm tạo).
Dưới đây là ví dụ của cả hai chế độ này.
Ví dụ 1: Học trình tự
Đây là một ví dụ nhanh về đào tạo LSTM (loại RNN) giữ toàn bộ chuỗi xung quanh. Trong ví dụ này, mỗi điểm dữ liệu đầu vào có 2 dấu thời gian, mỗi điểm có 3 tính năng; dữ liệu đầu ra có 2 dấu thời gian (vì return_sequences=True
), mỗi điểm có 4 điểm dữ liệu (vì đó là kích thước tôi chuyển đến LSTM
).
import keras.layers as L
import keras.models as M
import numpy
# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
# Datapoint 1
[
# Input features at timestep 1
[1, 2, 3],
# Input features at timestep 2
[4, 5, 6]
],
# Datapoint 2
[
# Features at timestep 1
[7, 8, 9],
# Features at timestep 2
[10, 11, 12]
]
])
# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
# Datapoint 1
[
# Target features at timestep 1
[101, 102, 103, 104],
# Target features at timestep 2
[105, 106, 107, 108]
],
# Datapoint 2
[
# Target features at timestep 1
[201, 202, 203, 204],
# Target features at timestep 2
[205, 206, 207, 208]
]
])
# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))
# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)
# Create the model.
model = M.Model(input=model_input, output=model_output)
# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')
# Train
model.fit(data_x, data_y)
Ví dụ 2: Học dấu thời gian cuối cùng
Mặt khác, nếu bạn muốn huấn luyện một LSTM chỉ xuất ra dấu thời gian cuối cùng trong chuỗi, thì bạn cần phải đặt return_sequences=False
(hoặc chỉ loại bỏ nó hoàn toàn khỏi hàm tạo, vì False
là mặc định). Và sau đó dữ liệu đầu ra của bạn ( data_y
trong ví dụ trên) cần được sắp xếp lại, vì bạn chỉ cần cung cấp dấu thời gian cuối cùng. Vì vậy, trong ví dụ thứ hai này, mỗi điểm dữ liệu đầu vào vẫn có 2 dấu thời gian, mỗi điểm có 3 tính năng. Tuy nhiên, dữ liệu đầu ra chỉ là một vectơ duy nhất cho mỗi điểm dữ liệu, bởi vì chúng tôi đã làm phẳng mọi thứ xuống một dấu thời gian duy nhất. Tuy nhiên, mỗi vectơ đầu ra vẫn có 4 tính năng (vì đó là kích thước tôi chuyển đến LSTM
).
import keras.layers as L
import keras.models as M
import numpy
# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
# Datapoint 1
[
# Input features at timestep 1
[1, 2, 3],
# Input features at timestep 2
[4, 5, 6]
],
# Datapoint 2
[
# Features at timestep 1
[7, 8, 9],
# Features at timestep 2
[10, 11, 12]
]
])
# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
# Datapoint 1
# Target features at timestep 2
[105, 106, 107, 108],
# Datapoint 2
# Target features at timestep 2
[205, 206, 207, 208]
])
# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))
# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)
# Create the model.
model = M.Model(input=model_input, output=model_output)
# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')
# Train
model.fit(data_x, data_y)