ChatGPT解决这个技术问题 Extra ChatGPT

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

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

https://i.stack.imgur.com/b4sus.jpg

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

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

对于 4 项任务中的每一项,可能需要一些解释。


S
Shaido

所以:

一对一:您可以使用密集层,因为您不处理序列: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)) 多对一:实际上,您的代码片段(几乎)是这种方法的一个例子: model = Sequential() model.add(LSTM(1, input_shape=(timesteps, data_dim))) 多对多:当输入的长度和输出与循环步数匹配:model = Sequential() model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True)) 当步数与输入/输出长度不同时的多对多:这在 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:, :])) #Select last N from output

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

从这一点开始:

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

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


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

@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 个特征。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅