Le reti neurali ricorrenti (RNN) sono progettate per apprendere i dati di sequenza. Come indovini, possono sicuramente prendere più funzionalità come input! Gli RNN di Keras accettano input 2D ( T , F ) di timestep T e funzionalità F (qui sto ignorando la dimensione del batch).
Tuttavia, non è sempre necessario o desiderato i timestep intermedi, t = 1, 2 ... ( T - 1). Pertanto, Keras supporta in modo flessibile entrambe le modalità. Per avere in uscita tutti i timestep T , passa return_sequences=True
al tuo RNN (ad esempio, LSTM
o GRU
) durante la costruzione. Se vuoi solo l'ultimo timestep t = T , usa return_sequences=False
(questo è il default se non passi return_sequences
al costruttore).
Di seguito sono riportati esempi di entrambe queste modalità.
Esempio 1: apprendimento della sequenza
Ecco un breve esempio di addestramento di un LSTM (tipo di RNN) che mantiene l'intera sequenza. In questo esempio, ciascun punto dati di input ha 2 timestep, ciascuno con 3 funzioni; i dati di output hanno 2 timestep (perché return_sequences=True
), ognuno con 4 punti dati (perché questa è la dimensione che passo a 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)
Esempio 2: apprendimento dell'ultimo timestep
Se, d'altra parte, si desidera addestrare un LSTM che emette solo l'ultimo timestep nella sequenza, è necessario impostare return_sequences=False
(o semplicemente rimuoverlo completamente dal costruttore, poiché False
è l'impostazione predefinita). Quindi i dati di output ( data_y
nell'esempio sopra) devono essere riorganizzati, poiché è necessario fornire solo l'ultimo timestep. Quindi, in questo secondo esempio, ogni punto di dati di input ha ancora 2 timestep, ognuno con 3 funzionalità. I dati di output, tuttavia, sono solo un singolo vettore per ciascun punto dati, perché abbiamo appiattito tutto in un unico timestep. Ognuno di questi vettori di output ha comunque 4 funzionalità (perché questa è la dimensione che passo a 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)