Redes neurais recorrentes (RNNs) são projetadas para aprender dados de sequência. Como você adivinha, eles definitivamente podem usar vários recursos como entrada! Os RNNs de Keras recebem entradas 2D ( T , F ) dos timesteps T e apresentam F (estou ignorando a dimensão do lote aqui).
No entanto, você nem sempre precisa ou deseja os intervalos de tempo intermediários, t = 1, 2 ... ( T - 1). Portanto, o Keras oferece suporte flexível aos dois modos. Para que ele produza todos os timestados T , passe return_sequences=True
para o seu RNN (por exemplo, LSTM
ou GRU
) na construção. Se você deseja apenas o último timestep t = T , use return_sequences=False
(este é o padrão se você não passar return_sequences
para o construtor).
Abaixo estão exemplos de ambos os modos.
Exemplo 1: aprendendo a sequência
Aqui está um exemplo rápido de treinamento de um LSTM (tipo de RNN) que mantém toda a sequência. Neste exemplo, cada ponto de dados de entrada possui 2 timesteps, cada um com 3 recursos; os dados de saída têm 2 timesteps (porque return_sequences=True
), cada um com 4 pontos de dados (porque esse é o tamanho para o qual passo 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)
Exemplo 2: aprendendo o último timestep
Se, por outro lado, você deseja treinar um LSTM que produz apenas o último timestep na sequência, é necessário definir return_sequences=False
(ou apenas removê-lo do construtor completamente, já que False
é o padrão). E então seus dados de saída ( data_y
no exemplo acima) precisam ser reorganizados, pois você só precisa fornecer o último timestep. Portanto, neste segundo exemplo, cada ponto de dados de entrada ainda possui 2 intervalos de tempo, cada um com 3 recursos. Os dados de saída, no entanto, são apenas um único vetor para cada ponto de dados, porque reduzimos tudo a um único passo de tempo. Porém, cada um desses vetores de saída ainda possui quatro recursos (porque esse é o tamanho que eu passo 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)