我正在尝试理解一个用于时间序列预测的模型。它使用了一个Conv1D层和两个LSTM层,之后是一个Dense层。我的问题是,是否应该在LSTM和Dense层之间使用Flatten()
?在我看来,输出应该只有一个值,形状为(None, 1)
,通过在LSTM和Dense层之间使用Flatten()
可以实现这一点。如果没有Flatten()
,输出形状将是(None, 30, 1)
。另一种选择是,我可以从第二个LSTM层中移除return_sequences=True
,我认为这与Flatten()
有相同的效果。哪一种方法更合适?它们会影响损失吗?这是模型的代码。
model = tf.keras.models.Sequential([ tf.keras.layers.Conv1D(filters=32, kernel_size=3, strides=1, padding="causal", activation="relu", input_shape=(30 ,1)), tf.keras.layers.LSTM(32, return_sequences=True), tf.keras.layers.LSTM(32, return_sequences=True), # tf.keras.layers.Flatten(), tf.keras.layers.Dense(1), ])
这是没有Flatten()
的模型摘要
Model: "sequential"_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv1d (Conv1D) (None, 30, 32) 128 _________________________________________________________________lstm (LSTM) (None, 30, 32) 8320 _________________________________________________________________lstm_1 (LSTM) (None, 30, 32) 8320 _________________________________________________________________dense (Dense) (None, 30, 1) 33 =================================================================Total params: 16,801Trainable params: 16,801Non-trainable params: 0_________________________________________________________________
回答:
嗯,这取决于你想实现什么。我试着给你一些提示,因为对我来说你想要得到的结果还不完全清楚。
如果你的LSTM使用return_sequences=True
,那么你将返回每个LSTM单元的输出,即每个时间步的输出。如果你随后添加一个Dense层,其中一个将被添加到每个LSTM层之上。
如果你在return_sequences=True
的情况下使用Flatten层,那么你基本上是在移除时间维度,在你的情况下会得到类似(None, 30)
的形状。然后,你可以添加一个Dense层或任何你需要的层。
如果你设置return_sequences=False
,你只会得到LSTM末端的输出(请注意,无论如何,由于LSTM的功能,它是基于之前时间步的计算),输出形状将是(None, dim)
,其中dim
等于你在LSTM中使用的隐藏单元数量(即32)。在这里,你同样可以简单地添加一个具有一个隐藏单元的Dense层,以获得你所寻找的结果。