Так:
Один к одному : вы можете использовать Dense
слой, поскольку вы не обрабатываете последовательности:
model.add(Dense(output_size, input_shape=input_shape))
Один ко многим : эта опция плохо поддерживается, так как объединение моделей в цепочку не очень простое дело Keras
, поэтому следующая версия является самой простой:
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
Многие-к-одному : на самом деле, ваш фрагмент кода является (почти) примером этого подхода:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
Многие-ко-многим : это самый простой фрагмент, когда длина ввода и вывода соответствует количеству повторяющихся шагов:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
Многие-ко-многим, когда количество шагов отличается от длины ввода / вывода : в Keras это ужасно сложно. Для этого не существует простых фрагментов кода.
РЕДАКТИРОВАТЬ: Объявление 5
В одном из моих недавних приложений мы реализовали кое-что, что может быть похоже на « многие ко многим» из 4-го изображения. Если вы хотите иметь сеть со следующей архитектурой (когда вход длиннее выхода):
O O O
| | |
O O O O O O
| | | | | |
O O O O O O
Вы можете добиться этого следующим образом:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Lambda(lambda x: x[:, -N:, :]
Где N
количество последних шагов, которые вы хотите пройти (на картинке N = 3
).
С этого момента переходят к:
O O O
| | |
O O O O O O
| | |
O O O
так же просто, как искусственная последовательность заполнения длины N
с использованием, например, 0
векторов, чтобы настроить ее до подходящего размера.