Les réseaux de neurones récurrents (RNN) sont conçus pour apprendre les données de séquence. Comme vous le devinez, ils peuvent certainement prendre plusieurs fonctionnalités en entrée! Les RNN de Keras prennent des entrées 2D ( T , F ) des pas de temps T et comportent F ( j'ignore la dimension de lot ici).
Cependant, vous n'avez pas toujours besoin ou ne voulez pas les pas de temps intermédiaires, t = 1, 2 ... ( T - 1). Par conséquent, Keras prend en charge de manière flexible les deux modes. Pour qu'il affiche tous les pas de temps T , passez return_sequences=True
à votre RNN (par exemple, LSTM
ou GRU
) à la construction. Si vous ne voulez que le dernier pas de temps t = T , alors utilisez return_sequences=False
(c'est la valeur par défaut si vous ne passez pas return_sequences
au constructeur).
Voici des exemples de ces deux modes.
Exemple 1: apprentissage de la séquence
Voici un exemple rapide de formation d'un LSTM (type de RNN) qui conserve toute la séquence. Dans cet exemple, chaque point de données d'entrée a 2 pas de temps, chacun avec 3 caractéristiques; les données de sortie ont 2 pas de temps (parce que return_sequences=True
), chacun avec 4 points de données (parce que c'est la taille à laquelle je passe 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)
Exemple 2: apprentissage du dernier pas de temps
Si, d'autre part, vous souhaitez former un LSTM qui ne produit que le dernier pas de temps dans la séquence, vous devez le définir return_sequences=False
(ou simplement le supprimer entièrement du constructeur, car False
c'est la valeur par défaut). Et puis vos données de sortie ( data_y
dans l'exemple ci-dessus) doivent être réorganisées, car vous n'avez qu'à fournir le dernier pas de temps. Donc, dans ce deuxième exemple, chaque point de données d'entrée a toujours 2 pas de temps, chacun avec 3 fonctionnalités. Les données de sortie, cependant, ne sont qu'un seul vecteur pour chaque point de données, car nous avons tout aplati en un seul pas de temps. Cependant, chacun de ces vecteurs de sortie a toujours 4 fonctionnalités (car c'est la taille à laquelle je passe 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)