在 Keras,许多对一、许多对许多的 LSTM 例子

我试着去理解 LSTM 以及如何用 Kera 来构建它们。我发现,运行 RNN 主要有4种模式(图片中的4种右模式)

enter image description here 图片来源: 安德烈 · 卡帕西

现在,我想知道在 Keras,每种方法的简约代码片段看起来会是什么样子。 比如说

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

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

73664 次浏览

所以:

  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. Many-to-many : 当输入和输出的长度匹配循环步骤的数目时,这是最简单的代码片段:

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

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

从现在开始:

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

是一个简单的人工填充序列的长度 N使用例如与 0载体,以调整到一个适当的大小。

伟大的回答作者:@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'))