如何在 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,我可以添加 RepeatVector
或 return_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
重复编码器的最后一个输出。
我正在尝试在 keras 中为时间序列开发一个编码器模型。数据的形状是(5039, 28, 1),也就是说我的seq_len是28,我有一个特征。对于编码器的第一层,我使用了 112 个 huni,第二层将有 56 个并且能够返回到解码器的输入形状,我必须添加具有 28 个 huni 的第 3 层(这个自动编码器应该重建它的输入)。但我不知道将 LSTM 层连接在一起的正确方法是什么。 AFAIK,我可以添加 RepeatVector
或 return_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
重复编码器的最后一个输出。