代码之家  ›  专栏  ›  技术社区  ›  Funzo

如何配置Keras中双向LSTM的输入形状

  •  6
  • Funzo  · 技术社区  · 6 年前

    我面临以下问题。 我有大量的文档要使用双向LSTM进行编码。每个文档都有不同的字数,可以将单词视为一个时间步。

    配置双向LSTM时,我们需要提供时间序列长度。 当我培训模型时,每个批次的该值都会不同。 我应该为 timeseries_size 我允许的最大文档大小是多少?任何大于此值的文档都不会被编码?

    配置示例:

    Bidirectional(LSTM(128, return_sequences=True), input_shape=(timeseries_size, encoding_size))
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Maxim    6 年前

    这是一个众所周知的问题,它涉及普通RNN和双向RNN。 This discussion on GitHub 可能对你有帮助。本质上,以下是最常见的选项:

    • 一个简单的解决方案是设置 timeseries_size 为训练集上的最大长度,并用零填充较短序列。 Example Keras code 。一个明显的缺点是,如果训练集碰巧同时具有很长和很短的输入,则会造成内存浪费。

    • 将输入样本分离到不同长度的桶中,例如 length <= 16 ,另一个铲斗用于 length <= 32 基本上这意味着为不同的句子集训练几个单独的LSTM。这种方法(称为 扣合 )需要更多的努力,但目前被认为是最有效的,并且实际用于最先进的翻译引擎 Tensorflow Neural Machine Translation

        2
  •  1
  •   Daniel Möller    6 年前

    一个选项是使用可变长度配置模型: input_shape=(None,encoding_size)

    然后,您必须单独培训每个文档。

    for epoch in range(epochs):
        for document,output in zip(list_of_documents,list_of_outputs):
            #make sure you have a batch, even if its size is 1
            document.reshape((1,this_doc_length,encoding_size)) 
            output.reshape((1,whatever_output_shape,...))   
    
            model.train_on_batch(document,output,....)
    

    其他选项是使用具有最大长度的单个输入数组并添加 Masking 图层。(如果您使用 Embedding 图层,只需制作参数 mask_zero=True )

    这对于单向LSTM非常有效,但我不确定它对于双向(从未测试过)是否正确实现。