如何在Keras中连接LSTM层,使用RepeatVector或return_sequence=True?

19

我正在尝试在Keras中为时间序列开发一个编码器模型。数据的形状为(5039,28,1),这意味着我的seq_len为28,只有一个特征。对于编码器的第一层,我使用112个隐藏单元,第二层将有56个单元,并且为了能够返回解码器的输入形状,我不得不添加第三层具有28个隐藏单元(这个自编码器应该重构其输入)。但我不知道连接LSTM层的正确方法是什么。据我所知,我可以添加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))并将其取消了... 还是我在你的代码中有什么误解了? - Super-intelligent Shade
1个回答

70

你可能需要亲自尝试来确定哪个更好,因为这取决于你要解决的问题。但是,我会告诉你这两种方法之间的区别。

Difference <code>return_sequences=True</code> and RepeatVector 基本上,return_sequences=True返回编码器过去观察到的所有输出,而RepeatVector则重复编码器的最后一个输出。


1
睁开我的眼睛,现在我能看得更清楚:)) - sariii
1
再次感谢您的深入回答,您有没有想法在哪些情况下应该使用哪个?我不是说百分之百确定,但通常情况下呢! - sariii
2
嗨@sariii,一个例子是机器翻译。例如,如果您有一个seq2seq模型,并且不想使用教师强制方法并且需要快速而简单的解决方案,则可以使用RepeatVectorreturn_sequences=False传递编码器RNN的最后状态(最后一个蓝色框)。但是,如果您要计算编码器状态的注意力权重,则需要使用return_sequences=True,因为您需要所有编码器状态来计算注意力权重。希望这有意义。 :) - thushv89
2
@Coderji,我是自己创造的,没有从其他地方获取 :) - thushv89
解码器中第一个单元的细胞状态和隐藏状态怎么处理?难道它们不应该等于编码器中的最后一个值吗? - Traveling Salesman
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接