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

Posted

技术标签:

【中文标题】如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?【英文标题】:How to connect LSTM layers in Keras, RepeatVector or return_sequence=True? 【发布时间】:2019-01-15 21:06:08 【问题描述】:

我正在尝试在 keras 中为时间序列开发编码器模型。数据的形状是(5039, 28, 1),意思是我的seq_len是28,我有一个特征。对于编码器的第一层,我使用 112 个单位,第二层将有 56 个,并且为了能够返回解码器的输入形状,我必须添加具有 28 个单位的第 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)

【问题讨论】:

我是古玩,你的代码中RepeatVector(1) 的原因是什么。你只是用它来添加1的时间维度吗?但是随后您使用Reshape((28, 1)) 跟进并立即将其取出...还是我误解了您的代码中的某些内容? 【参考方案1】:

您可能必须自己看看哪个更好,因为这取决于您要解决的问题。但是,我要告诉您这两种方法之间的区别。

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

【讨论】:

睁开眼睛,现在我看得更清楚了:)) 再次感谢您有见地的回答,您知道我们应该在哪里使用哪个吗?我不是说 100%,但一般都喜欢! 嗨@sariii,一个例子是机器翻译。例如,如果您有一个 seq2seq 模型并且您不想使用教师强制并且想要一个快速而肮脏的解决方案,您可以使用 RepeatVectorreturn_sequences=False 传递编码器 RNN 的最后状态(最后一个蓝色框) .但是,如果要计算编码器状态的注意力权重,则需要使用return_sequences=True,因为您需要所有编码器状态来计算注意力权重。希望这是有道理的。 :) @thushv89 非常感谢您的解释。你能帮我一个忙,看看这个问题吗? ***.com/questions/56433993/…我看了很多,知道是什么问题但无法解决 @Coderji,我创建了它们。我没有从任何地方得到它:)

以上是关于如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?的主要内容,如果未能解决你的问题,请参考以下文章

如何将保存的模型转换或加载到 TensorFlow 或 Keras?

如何在 Keras 中同时获取 LSTM 或 GRU 的最后输出和完整序列?

如何在 TensorFlow、Keras 或 PyTorch 中部署 CoreML 模型?

Keras:如何保存模型或权重?

如何从 hkl 或任何保存的 keras 配置中重建 keras 模型?

如何在 Keras 中将标量添加到张量或从标量创建张量?