所以:
一对一:由于您不处理序列,因此可以使用 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))
多对一: 实际上,你的代码片段(几乎)是这种方法的一个例子:
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
在我的最近一些应用程序中,我们实现了类似于第4张图中的多对多的东西。如果你想要一个具有以下架构的网络(当输入比输出更长时):
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:, :]))
其中N
是您想覆盖的最后几个步骤的数量(在图像中N = 3
)。
从这一点出发到达:
O O O
| | |
O O O O O O
| | |
O O O
通过使用例如0
向量对长度为N
的人工填充序列进行调整,使其适应所需的大小,这就是简单的方法。