Assim:
Um para um : você pode usar uma Dense
camada, pois não está processando sequências:
model.add(Dense(output_size, input_shape=input_shape))
Um para muitos : esta opção não é bem suportada porque o encadeamento de modelos não é muito fácil Keras
, então a seguinte versão é a mais fácil:
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
Muitos para um : na verdade, seu snippet de código é (quase) um exemplo dessa abordagem:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
Muitos para muitos : este é o snippet mais fácil quando o comprimento da entrada e saída corresponde ao número de etapas recorrentes:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
Muitos-para-muitos quando o número de etapas difere do comprimento de entrada / saída : isso é assustadoramente difícil no Keras. Não há snippets de código fáceis para codificar isso.
EDITAR: Anúncio 5
Em um de meus aplicativos recentes, implementamos algo que pode ser semelhante a muitos para muitos da 4ª imagem. No caso de você desejar ter uma rede com a seguinte arquitetura (quando uma entrada é maior que a saída):
O O O
| | |
O O O O O O
| | | | | |
O O O O O O
Você pode conseguir isso da seguinte maneira:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Lambda(lambda x: x[:, -N:, :]
Onde N
está o número das últimas etapas que você deseja cobrir (na imagem N = 3
).
A partir deste ponto, chegando a:
O O O
| | |
O O O O O O
| | |
O O O
é tão simples quanto uma sequência de preenchimento artificial de comprimento N
usando, por exemplo, com 0
vetores, para ajustá-la a um tamanho apropriado.