我尝试了解 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 项任务中的每一项,可能需要一些解释。
所以:
一对一:您可以使用密集层,因为您不处理序列: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
的人工填充序列一样简单,以便将其调整到适当的大小。
@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”步骤的角色时遇到问题。
不定期副业成功案例分享
x
和其他等于0
的输入。但是 - 另一方面 - 他们可能会接受同样的x
也重复了很多次。不同的方法是链接模型,这在Keras
中很难。我提供的选项是Keras
中 一对多 架构的最简单情况。