我尝试了解LSTM以及如何使用Keras构建它们。我发现,主要有4种模式可以运行RNN(图中的4种正确模式)
图片来源:Andrej Karpathy
现在,我想知道在Keras中,每个代码的简约代码段看起来如何。所以像
model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))
对于这4个任务中的每一个,也许需要一点解释。
我尝试了解LSTM以及如何使用Keras构建它们。我发现,主要有4种模式可以运行RNN(图中的4种正确模式)
图片来源:Andrej Karpathy
现在,我想知道在Keras中,每个代码的简约代码段看起来如何。所以像
model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))
对于这4个任务中的每一个,也许需要一点解释。
Answers:
所以:
一对一:您可以使用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
在我最近的一个应用程序中,我们实现了与第四张图片中的多对多内容相似的内容。如果您要使用以下架构的网络(输入长于输出时):
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
N
与使用例如0
向量的人工填充序列的长度一样简单,以便将其调整为适当的大小。
x
和其他等于的输入0
。但是-另一方面-他们也可能接受相同的x
多次重复。不同的方法是链接很难使用的模型Keras
。我提供的选项是中最简单的一对多体系结构Keras
。
@MarcinMoż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”步骤的角色时遇到问题。