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

Posted

技术标签:

【中文标题】Keras 中的多对一和多对多 LSTM 示例【英文标题】:Many to one and many to many LSTM examples in Keras 【发布时间】:2017-08-19 11:38:24 【问题描述】:

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

图片来源:Andrej Karpathy

现在我想知道他们每个人的简约代码 sn-p 在 Keras 中会是什么样子。 所以像

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

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

【问题讨论】:

【参考方案1】:

所以:

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

    model.add(Dense(output_size, input_shape=input_shape))
    

    一对多:这个选项不太支持,因为Keras中的模型链接不太容易,所以下面的版本是最简单的:

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
    

    多对一:实际上,您的代码 sn-p (几乎)是这种方法的一个示例:

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

    Many-to-many:当输入和输出的长度与循环步数匹配时,这是最简单的sn-p:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    

    当步数与输入/输出长度不同时的多对多:这在 Keras 中非常困难。没有简单的代码 sn-ps 来编写代码。

编辑:广告 5

在我最近的一个应用程序中,我们实现了可能类似于第四张图片中的 many-to-many 的东西。如果您想拥有一个具有以下架构的网络(当输入长于输出时):

                                        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:, :])) #Select last N from output

其中N 是您要覆盖的最后步骤数(在图像N = 3 上)。

从现在开始:

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

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

【讨论】:

一个澄清:例如对于多对一,您使用 LSTM(1, input_shape=(timesteps, data_dim))) 我认为 1 代表 LSTM 单元/隐藏节点的数量,但显然不是你将如何编写一个多对一的代码,比如说 512 个节点? (因为我读到类似的东西,我认为它可以用 model.add(LSTM(512, input_shape=...)) model.add(Dense(1)) what is that used for than?) 在这种情况下 - 你的代码 - 纠正错字后应该没问题。 为什么我们使用RepeatVector,而不是第一个条目1 = 0而其他所有条目= 0的向量(根据上图,在后面的状态下根本没有输入,并且并不总是相同的输入,在我的理解中重复向量会做什么) 如果您仔细考虑一下这张图片 - 它只是 一对多 的概念的概念展示。所有这些隐藏单元必须接受某物作为输入。所以 - 他们可能接受相同的输入以及第一个输入等于x 和其他等于0 的输入。但是 - 另一方面 - 他们可能会接受同样的x 重复多次。不同的方法是链接模型,这在Keras 中很难。我提供的选项是Keras一对多架构的最简单情况。 不错!我正在考虑在 GAN 架构中使用 LSTM N to N。我将有一个基于 LSTM 的生成器。我将给这个生成器(如 gans 中的“潜在变量”中使用的)时间序列的前半部分,这个生成器将产生时间序列的后半部分。然后我将结合两半(真实的和生成的)来为 gan 生成“假”输入。您认为使用解决方案中的第 4 点有用吗?或者,换句话说,这(解决方案 4)是正确的方法吗?【参考方案2】:

@Marcin Moż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')) 

【讨论】:

你能解释一下B) Encoder-Decoder LSTM架构的细节吗?我在理解“RepeatVector”/“TimeDistributed”步骤的角色时遇到问题。 能否请您帮助如何正确地为多对多或编码器-解码器模型提供多维数据?我主要是在与形状作斗争。假设我们有一个总数据集存储在一个形状为 (45000, 100, 6) = (Nsample, Ntimesteps, Nfeatures) 的数组中,即我们有 45000 个样本,具有 100 个时间步长和 6 个特征。

以上是关于Keras 中的多对一和多对多 LSTM 示例的主要内容,如果未能解决你的问题,请参考以下文章

Json序列化,有多对一和多对多关系时出现的问题

Mybatis入门

具有不同序列长度的多对多序列预测

hibernate入门三之关联映射(一对多和多对一)

如何为LSTM Keras中的多步和多变量准备时间序列数据

具有相同 ID 键字段的多对多