我试着去理解 LSTM 以及如何用 Kera 来构建它们。我发现,运行 RNN 主要有4种模式(图片中的4种右模式)
图片来源: 安德烈 · 卡帕西
现在,我想知道在 Keras,每种方法的简约代码片段看起来会是什么样子。 比如说
model = Sequential() model.add(LSTM(128, input_shape=(timesteps, data_dim))) model.add(Dense(1))
对于4个任务中的每一个,可能需要一点解释。
所以:
一对一 : 您可以使用 Dense层,因为您不处理序列:
Dense
model.add(Dense(output_size, input_shape=input_shape))
一对多 : 这个选项不支持,因为链接模型在 Keras中不是很容易,所以下面的版本是最简单的一个:
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)))
Many-to-many : 当输入和输出的长度匹配循环步骤的数目时,这是最简单的代码片段:
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上)。
N
N = 3
从现在开始:
O O O | | | O O O O O O | | | O O O
是一个简单的人工填充序列的长度 N使用例如与 0载体,以调整到一个适当的大小。
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'))