Я предполагаю, что вам нужно будет поделиться параметрами для каждого массива, который вы складываете.
Если бы вы складывали совершенно новые функции, тогда не было бы связанной целис каждым из них.
Если бы вы складывали совершенно разные примеры, вы бы не использовали 3D-массивы, а просто добавляли их в конец, как обычно.
Решение
Чтобы решить эту проблему, я бы использовал оболочку TimeDistributed из Keras .
LSTM ожидаютshape (j, k)
, где j
- количество временных шагов, а k
- количество функций.Поскольку вы хотите сохранить свой массив в виде 3D для ввода и вывода, вам нужно будет использовать другое измерение, чем измерение элемента.
Краткое примечание:
Я думаю, что важно отметить разницу между подходами.Объединение в размерности объекта дает вам несколько объектов за один и тот же временной шаг.В этом случае вы хотели бы использовать те же слои LSTM и не идти по этому пути.Поскольку вам нужны 3D-вход и 3D-выход, я предлагаю вам создать новое измерение для стека, которое позволит вам независимо применять одни и те же слои LSTM.
TimeDistributed:
Эта оболочка применяет слой к каждому массиву с индексом 1
.Укладывая массивы X1
и X2
в индекс 1
и используя оболочку TimeDistributed, вы применяете слои LSTM независимо к каждому массиву, который вы собираете.Обратите внимание, что исходные и обновленные сводки моделей имеют одинаковое количество параметров.
Шаги реализации:
Первый шаг - изменить формуввод (40, 2)
в (2, 40, 1)
.Это дает вам эквивалент 2 x (40, 1)
входных данных массива.Вы можете сделать это либо в модели, как я, либо при создании набора данных и обновить форму ввода.
- Добавляя дополнительное измерение
(..., 1)
в конец, мы сохраняемданные в формате, который LSTM мог бы понять, если бы он просто просматривал один из массивов, которые мы сложили за раз.Обратите внимание, например, на ваш исходный input_shape (40, 1)
.
Затем оберните каждый слой в оболочку TimeDistributed.
И наконецизмените вывод y, чтобы он соответствовал вашим данным, поменяв (2, 10)
на (10, 2)
.
код
from tensorflow.python.keras import Sequential
from tensorflow.python.keras.layers import LSTM, Dense, TimeDistributed, InputLayer, Reshape
from tensorflow.python.keras import backend
import numpy as np
# Original Model
model = Sequential()
model.add(LSTM(12, input_shape=(40, 1), return_sequences=True))
model.add(LSTM(12, return_sequences=True))
model.add(LSTM(6, return_sequences=False))
model.add((Dense(10)))
model.summary()
Сводка оригинальной модели
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 40, 12) 672
_________________________________________________________________
lstm_1 (LSTM) (None, 40, 12) 1200
_________________________________________________________________
lstm_2 (LSTM) (None, 6) 456
_________________________________________________________________
dense (Dense) (None, 10) 70
=================================================================
Total params: 2,398
Trainable params: 2,398
Non-trainable params: 0
_________________________________________________________________
Apply TimeDistributed Wrapper
model = Sequential()
model.add(InputLayer(input_shape=(40, 2)))
model.add(Reshape(target_shape=(2, 40, 1)))
model.add(TimeDistributed(LSTM(12, return_sequences=True)))
model.add(TimeDistributed(LSTM(12, return_sequences=True)))
model.add(TimeDistributed(LSTM(6, return_sequences=False)))
model.add(TimeDistributed(Dense(10)))
model.add(Reshape(target_shape=(10, 2)))
model.summary()
Обновленная сводка модели
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
reshape (Reshape) (None, 2, 40, 1) 0
_________________________________________________________________
time_distributed (TimeDistri (None, 2, 40, 12) 672
_________________________________________________________________
time_distributed_1 (TimeDist (None, 2, 40, 12) 1200
_________________________________________________________________
time_distributed_2 (TimeDist (None, 2, 6) 456
_________________________________________________________________
time_distributed_3 (TimeDist (None, 2, 10) 70
_________________________________________________________________
reshape_1 (Reshape) (None, 10, 2) 0
=================================================================
Total params: 2,398
Trainable params: 2,398
Non-trainable params: 0
_________________________________________________________________