Повторні нейронні мережі (RNN) призначені для вивчення даних послідовностей. Як ви здогадуєтесь, вони напевно можуть приймати декілька функцій як вхідні дані! RNN Keras приймають двовимірні входи ( T , F ) часових кроків T і функції F (я ігнорую розмір партії тут).
Однак, вам не завжди потрібні або потрібні проміжні часові кроки, t = 1, 2 ... ( T - 1). Тому Керас гнучко підтримує обидва режими. Щоб воно виводило всі T часові кроки, перейдіть return_sequences=True
до свого RNN (наприклад, LSTM
або GRU
) під час створення. Якщо ви хочете лише останній часовий крок t = T , тоді використовуйте return_sequences=False
(це типово, якщо ви не переходите return_sequences
до конструктора).
Нижче наведено приклади обох цих режимів.
Приклад 1: Вивчення послідовності
Ось короткий приклад підготовки LSTM (типу RNN), який зберігає всю послідовність навколо. У цьому прикладі кожна точка вхідних даних має 2 часових кроки, кожен з яких має 3 функції; вихідні дані мають 2 часові кроки (тому що return_sequences=True
), кожен з яких має 4 точки даних (тому що це розмір, який я передаю 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)
Приклад 2: Вивчення останнього кроку часу
Якщо, з іншого боку, ви хочете навчити LSTM, який видає лише останній часовий крок у послідовності, тоді вам потрібно встановити return_sequences=False
(або просто видалити його повністю з конструктора, оскільки False
це за замовчуванням). І тоді ваші вихідні дані ( data_y
у прикладі вище) потрібно переставити, оскільки вам потрібно лише надати останній часовий крок. Отже, у цьому другому прикладі кожна точка вхідних даних все ще має 2 кроки часу, кожен з яких має 3 функції. Однак вихідні дані є лише одним вектором для кожної точки даних, тому що ми зрівняли все до одного часового кроку. Кожен з цих вихідних векторів все ж має 4 функції (адже саме це розмір, який я передаваю 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)