Keras中的多对一和多对LSTM示例

Luc*_*ede 86 machine-learning neural-network deep-learning keras recurrent-neural-network

我尝试了解LSTM以及如何使用Keras构建它们.我发现,主要有4种运行RNN的模式(图中右边4种)

在此输入图像描述 图片来源:Andrej Karpathy

现在我想知道他们每个人的简约代码片段在Keras中会是什么样子.所以像

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*jko 94

所以:

  1. 一对一:您可以使用Dense图层,因为您不处理序列:
model.add(Dense(output_size, input_shape=input_shape))
Run Code Online (Sandbox Code Playgroud)

2. 一对多:此选项不受支持,因为链接模型不是很容易Keras,因此以下版本是最简单的:

model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
Run Code Online (Sandbox Code Playgroud)
  1. 多对一:实际上,您的代码片段(几乎)是这种方法的一个示例:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
Run Code Online (Sandbox Code Playgroud)
  1. 多对多:当输入和输出的长度与循环步数相匹配时,这是最简单的代码段:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
Run Code Online (Sandbox Code Playgroud)
  1. 当步数与输入/输出长度不同时,多对多:这在Keras中很难实现.编码没有简单的代码片段.

编辑:广告5

在我最近的一个应用程序中,我们实现了与第4张图像中的多对多相似的内容.如果您希望网络具有以下架构(当输入长于输出时):

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式实现此目的:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]
Run Code Online (Sandbox Code Playgroud)

哪里N是你想覆盖(图像最后的步数N = 3).

从这一点开始:

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 
Run Code Online (Sandbox Code Playgroud)

N与使用例如0矢量的人工填充长度序列一样简单,以便将其调整到合适的大小.

  • 一个澄清:例如,对于多对一,您使用LSTM(1,input_shape =(timesteps,data_dim)))我认为1代表LSTM单元/隐藏节点的数量,但显然不是如何编码多个 - to to one with let say,512个节点比?(因为我读了一些simliar,我以为它会用model.add(LSTM(512,input_shape = ...))来完成model.add(Dense(1))用的是什么?) (7认同)
  • 如果您仔细考虑这张图片 - 它只是 **一对多** 思想的概念呈现。所有这些隐藏单元**必须**接受某些内容作为输入。因此,它们可能接受相同的输入以及第一个输入等于“x”而其他输入等于“0”的输入。但是,另一方面,他们也可能接受相同的“x”重复多次。不同的方法是链接模型,这在“Keras”中很难。我提供的选项是“Keras”中**一对多**架构的最简单的情况。 (3认同)

gus*_*avz 13

@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))
Run Code Online (Sandbox Code Playgroud)

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')) 
Run Code Online (Sandbox Code Playgroud)

  • 您能否详细解释一下“B) Encoder-Decoder LSTM”架构?我在理解“RepeatVector”/“TimeDistributed”步骤的作用时遇到问题。 (5认同)