Entonces:
Uno a uno : podría usar una Dense
capa ya que no está procesando secuencias:
model.add(Dense(output_size, input_shape=input_shape))
Uno a muchos : esta opción no se admite bien ya que encadenar modelos no es muy fácil Keras
, por lo que la siguiente versión es la más sencilla:
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
Muchos a uno : en realidad, su fragmento de código es (casi) un ejemplo de este enfoque:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
Muchos a muchos : este es el fragmento más sencillo cuando la longitud de la entrada y la salida coincide con el número de pasos recurrentes:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
Muchos a muchos cuando el número de pasos difiere de la longitud de entrada / salida : esto es increíblemente difícil en Keras. No hay fragmentos de código fáciles para codificar eso.
EDITAR: Anuncio 5
En una de mis aplicaciones recientes, implementamos algo que podría ser similar a muchos a muchos de la cuarta imagen. En caso de que desee tener una red con la siguiente arquitectura (cuando una entrada es más larga que la salida):
O O O
| | |
O O O O O O
| | | | | |
O O O O O O
Puede lograr esto de la siguiente manera:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Lambda(lambda x: x[:, -N:, :]
¿Dónde N
está el número de últimos pasos que desea cubrir (en la imagen N = 3
)?
Desde este punto llegar a:
O O O
| | |
O O O O O O
| | |
O O O
es tan simple como una secuencia de relleno artificial de longitud N
usando, por ejemplo, con 0
vectores, para ajustarlo a un tamaño apropiado.