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

时间:2017-03-26 21:47:35

标签: machine-learning neural-network deep-learning keras recurrent-neural-network

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

enter image description here 图片来源:Andrej Karpathy

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

这样的东西
model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

对于4个任务中的每一个,可能会有一点解释。

2 个答案:

答案 0 :(得分:73)

所以:

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

    2。 一对多:由于链接模型在Keras中不是很容易,因此不支持此选项,因此以下版本是最简单的版本:

        model.add(RepeatVector(number_of_times, input_shape=input_shape))
        model.add(LSTM(output_size, return_sequences=True))
    
    1. 多对一:实际上,您的代码段(几乎)就是这种方法的一个示例:
    2.     model = Sequential()
          model.add(LSTM(1, input_shape=(timesteps, data_dim)))
      
      1. 多对多:当输入和输出的长度与重复步骤的数量相匹配时,这是最简单的代码段:
      2.     model = Sequential()
            model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
        
        1. 当步数与输入/输出长度不同时多对多:这在Keras中非常难以理解。编码没有简单的代码片段。
        2. 编辑:广告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 
          

          与使用例如长度N的人工填充序列一样简单。使用0向量,以便将其调整为适当的大小。

答案 1 :(得分:0)

@MarcinMożejko的精彩回答

我会在NR.5中添加以下内容(许多输入/输出长度不同的人很多):

A)为香草LSTM

L = [1, 3, 3, 4, 4, 5, 5, 7, 8, 9, 9, 9]; result = [[1, 3, 4, 5, 7, 8, 9]]
L = [3, 4, 5, 9, 9]; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9]]
L = [9]; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9], [9]]
L = []; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9], [9], []]

B)作为编解码器LSTM

model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))