Ответ 1
Так:
- Один-к-одному: вы можете использовать
Dense
слой, поскольку вы не обрабатываете последовательности:
model.add(Dense(output_size, input_shape=input_shape))
2. Один-ко-многим: эта опция не поддерживается, так как цепочка моделей не очень проста в 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))
- Много ко многим, когда количество шагов отличается от длины ввода/вывода: в Керасе это очень сложно. Там нет простых фрагментов кода, чтобы закодировать это.
РЕДАКТИРОВАТЬ: объявление 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
векторов, чтобы отрегулировать ее до подходящего размера.