Las redes neuronales recurrentes (RNN) están diseñadas para aprender datos de secuencia. Como supones, ¡definitivamente pueden tomar múltiples características como entrada! Los RNN de Keras toman entradas 2D ( T , F ) de pasos de tiempo T y características F (estoy ignorando la dimensión del lote aquí).
Sin embargo, no siempre necesita o desea los pasos de tiempo intermedios, t = 1, 2 ... ( T - 1). Por lo tanto, Keras admite de manera flexible ambos modos. Para que emita todos los pasos de tiempo T , pase return_sequences=True
a su RNN (por ejemplo, LSTM
o GRU
) en la construcción. Si solo desea el último paso de tiempo t = T , use return_sequences=False
(este es el valor predeterminado si no pasa return_sequences
al constructor).
A continuación hay ejemplos de ambos modos.
Ejemplo 1: aprender la secuencia
Aquí hay un ejemplo rápido de entrenamiento de un LSTM (tipo de RNN) que mantiene la secuencia completa. En este ejemplo, cada punto de datos de entrada tiene 2 pasos de tiempo, cada uno con 3 características; los datos de salida tienen 2 pasos de tiempo (porque return_sequences=True
), cada uno con 4 puntos de datos (porque ese es el tamaño al que paso 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)
Ejemplo 2: Aprendiendo el último paso de tiempo
Si, por otro lado, desea entrenar un LSTM que solo genera el último paso de tiempo en la secuencia, entonces debe configurarlo return_sequences=False
(o simplemente eliminarlo del constructor por completo, ya que False
es el valor predeterminado). Y luego sus datos de salida ( data_y
en el ejemplo anterior) deben reorganizarse, ya que solo necesita proporcionar el último paso de tiempo. Entonces, en este segundo ejemplo, cada punto de datos de entrada todavía tiene 2 pasos de tiempo, cada uno con 3 características. Sin embargo, los datos de salida son solo un vector para cada punto de datos, porque hemos aplanado todo a un solo paso de tiempo. Sin embargo, cada uno de estos vectores de salida todavía tiene 4 características (porque ese es el tamaño al que paso 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)