我假设您需要共享您堆叠的每个数组的参数。
解决方案
为了解决这个问题,我会利用TimeDistributed wrapper from Keras。
LSTM 层需要一个形状(j, k),其中j 是时间步数,k 是特征数。由于您希望将输入和输出的数组保持为 3D,因此您需要堆叠在与特征维度不同的维度上。
快速旁注:
我认为注意这些方法之间的区别很重要。在特征维度上堆叠为您提供了相同时间步长的多个特征。在这种情况下,你会想要使用相同的 LSTM 层而不是走这条路。因为你想要一个 3D 输入和一个 3D 输出,所以我建议你创建一个新的维度来堆叠,这样你就可以独立地应用相同的 LSTM 层。
时间分布:
此包装器在1 索引处为每个数组应用一个层。
通过将 X1 和 X2 数组堆叠在 1 索引上,并使用 TimeDistributed 包装器,您可以将 LSTM 层独立地应用于您堆叠的每个数组。请注意,原始模型摘要和更新模型摘要具有完全相同数量的参数。
实施步骤:
-
第一步是将(40, 2)的输入reshape成(2, 40, 1)。这相当于 2 x (40, 1) 数组输入。您可以像我一样在模型中执行此操作,也可以在构建数据集并更新输入形状时执行此操作。
- 通过在末尾添加额外的维度
(..., 1),我们将数据保持为 LSTM 可以理解的格式,如果它只是查看我们一次堆叠的数组之一。例如,请注意您的原始 input_shape 是 (40, 1)。
然后将每一层包装在 TimeDistributed 包装器中。
最后,通过将 (2, 10) 交换为 (10, 2) 来重塑 y 输出以匹配您的数据。
代码
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
_________________________________________________________________
应用 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
_________________________________________________________________