如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?

How to connect LSTM layers in Keras, RepeatVector or return_sequence=True?

我正在尝试在 keras 中为时间序列开发一个编码器模型。数据的形状是(5039, 28, 1),也就是说我的seq_len是28,我有一个特征。对于编码器的第一层,我使用了 112 个 huni,第二层将有 56 个并且能够返回到解码器的输入形状,我必须添加具有 28 个 huni 的第 3 层(这个自动编码器应该重建它的输入)。但我不知道将 LSTM 层连接在一起的正确方法是什么。 AFAIK,我可以添加 RepeatVectorreturn_seq=True。您可以在以下代码中看到我的两个模型。我想知道会有什么区别,哪种方法是正确的?

第一个使用 return_sequence=True 的模型:

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112, return_sequences=True)(inputEncoder)
snd = LSTM(56, return_sequences=True)(firstEncLayer)
outEncoder = LSTM(28)(snd)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28,1))(context)

encoder_model = Model(inputEncoder, outEncoder)
firstDecoder = LSTM(112, return_sequences=True)(context_reshaped)
outDecoder = LSTM(1, return_sequences=True)(firstDecoder)

autoencoder = Model(inputEncoder, outDecoder)

第二个模型RepeatVector

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112)(inputEncoder)
firstEncLayer = RepeatVector(1)(firstEncLayer)
snd = LSTM(56)(firstEncLayer)
snd = RepeatVector(1)(snd)
outEncoder = LSTM(28)(snd)
encoder_model = Model(inputEncoder, outEncoder)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28, 1))(context)

firstDecoder = LSTM(112)(context_reshaped)
firstDecoder = RepeatVector(1)(firstDecoder)
sndDecoder = LSTM(28)(firstDecoder)

outDecoder = RepeatVector(1)(sndDecoder)
outDecoder = Reshape((28, 1))(outDecoder)

autoencoder = Model(inputEncoder, outDecoder)

您可能需要自己看看哪个更好,因为这取决于您要解决的问题。但是,我将向您介绍这两种方法之间的区别。

本质上,return_sequences=True returns 编码器过去观察到的所有输出,而 RepeatVector 重复编码器的最后一个输出。