Keras中的多对一和多对多LSTM示例


108

我尝试了解LSTM以及如何使用Keras构建它们。我发现,主要有4种模式可以运行RNN(图中的4种正确模式)

在此处输入图片说明 图片来源:Andrej Karpathy

现在,我想知道在Keras中,每个代码的简约代码段看起来如何。所以像

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

对于这4个任务中的每一个,也许需要一点解释。

Answers:


121

所以:

  1. 一对一:您可以使用Dense一层,因为您不处理序列:

    model.add(Dense(output_size, input_shape=input_shape))
  2. 一对多:不支持此选项,因为在中链接模型不是很容易Keras,因此以下版本是最简单的版本:

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
  3. 多对一:实际上,您的代码段(几乎)是此方法的一个示例:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  4. 多对多:输入和输出的长度与循环步数匹配时,这是最简单的代码段:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  5. 当步数与输入/输出长度不同时,多对多:这在Keras中非常难。没有简单的代码片段可以对此进行编码。

编辑:广告5

在我最近的一个应用程序中,我们实现了与第四张图片中的多对多内容相似的内容。如果您要使用以下架构的网络(输入长于输出时):

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O

您可以通过以下方式实现此目的:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]

N您想覆盖的最后几个步骤在哪里(在图片上N = 3)。

从这一点开始:

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 

N与使用例如0向量的人工填充序列的长度一样简单,以便将其调整为适当的大小。


10
一个澄清:例如,对于多对一,您使用LSTM(1,input_shape =(timesteps,data_dim)))我以为1代表LSTM单元/隐藏节点的数量,但显然不是,您将如何编码Many-可以说一对一,但是比512个节点还好吗?(因为我看过类似的东西,所以我认为可以用model.add(LSTM(512,input_shape = ...))来完成。model.add(Dense(1))的用途是什么?)
Luca Thiede

1
在这种情况下-您的代码-纠正错字后应该可以。
马辛Możejko

为什么我们使用RepeatVector,而不是使用第一个条目为1 = 0且所有其他条目= 0的向量(根据上图,在后面的状态中,根本没有输入,并且不一定总是相同的输入,重复向量在我的理解下会做什么)
卢卡·锡德

1
如果您仔细考虑这张图片,那只是一对多想法的概念性介绍。所有这些隐藏单元都必须接受某些内容作为输入。因此,他们可能会接受相同的输入以及第一个输入等于x和其他等于的输入0。但是-另一方面-他们也可能接受相同的x多次重复。不同的方法是链接很难使用的模型Keras。我提供的选项是中最简单的一对多体系结构Keras
MarcinMożejko17年

真好!Iam考虑在GAN体系结构中使用LSTM N toN。我将有一个基于LSTM的生成器。我将给这个生成器(如gans中“潜在变量”中所使用的)时间序列的前一半,而该生成器将产生时间序列的后一半。然后,我将结合两个半部分(真实的和生成的),以生成gan的“假”输入。您是否认为使用解决方案中的第4点会起作用?或者换句话说,这(解决方案4)是正确的方法吗?
rjpg

6

@MarcinMożejko的出色回答

我会在NR.5中添加以下内容(很多输入/输出长度很多的人):

A)香草LSTM

model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))

B)作为LSTM的编解码器

model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES))  
model.add(RepeatVector(N_OUTPUTS))
model.add(LSTM(N_BLOCKS, return_sequences=True))  
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear')) 

1
您能解释一下B) Encoder-Decoder LSTM架构的细节吗?我在理解“ RepeatVector” /“ TimeDistributed”步骤的角色时遇到问题。
Marsellus Wallace
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.