理解Keras中rnn的无限长输入序列

理解Keras中rnn的无限长输入序列,keras,Keras,我一直在研究keras中深度学习模型的某个架构的实现,当时我遇到了一个我无法掌握的技术性问题。在代码中,模型实现为具有两个输入;第一个是通过图形的正常输入(word\u id,在下面的示例代码中),第二个是输入的长度,它似乎只涉及keras模型中的输入参数(序列长度,在下面的示例代码中) 我认为这样做是为了让网络接受任意长度的序列。我的问题如下: 我的想法对吗 如果是的话,我觉得有点 引擎盖下的魔法。有没有关于如何包装的建议 绕着这个转 这是否意味着使用这种方法,一个人不需要填充他的序列(无论是

我一直在研究keras中深度学习模型的某个架构的实现,当时我遇到了一个我无法掌握的技术性问题。在代码中,模型实现为具有两个输入;第一个是通过图形的正常输入(
word\u id
,在下面的示例代码中),第二个是输入的长度,它似乎只涉及keras
模型中的
输入
参数(
序列长度
,在下面的示例代码中)

我认为这样做是为了让网络接受任意长度的序列。我的问题如下:

  • 我的想法对吗
  • 如果是的话,我觉得有点 引擎盖下的魔法。有没有关于如何包装的建议 绕着这个转
  • 这是否意味着使用这种方法,一个人不需要填充他的序列(无论是在训练中还是在预测中),keras不知何故知道如何自动填充序列
  • 是否需要将序列长度作为输入传递? 不,绝对没有必要将序列长度作为输入传递,无论是使用固定长度序列还是可变长度序列

    老实说,我不明白为什么代码中的模型在没有发送到任何模型层进行处理的情况下使用这个输入

    这真的是完整的模型吗

    为什么要传递序列长度作为输入? 嗯,也许他们想用这些来进行一些自定义计算。这可能是一个有趣的选项,但是您发布的代码中没有这些计算。这个模型对这种输入毫无作用

    如何使用可变序列长度? 为此,您有两种选择:

    • 如您所述,将序列填充到固定大小,并将
      掩蔽
      层添加到输入(或使用嵌入层中的
      掩蔽_zeros=True
      选项)
    • 使用长度标注作为
      None
      。这是通过以下方法之一完成的:
      • 批次形状=(批次大小,无)
      • 输入_形状=(无,)
      • PS:这些形状用于嵌入层。直接进入循环网络的输入将有一个额外的输入特征的最后维度
    当使用第二个选项(length=None)时,应该分别处理每个批,因为不能将所有长度不同的序列放在同一个numpy数组中。但是模型本身没有限制,在这种情况下不需要填充

    如何使用“无限”长度 使用无限长度的唯一方法是使用
    stateful=True

    在这种情况下,您通过的每个批次将不会被视为“另一组序列”,而是“上一批次的附加步骤”。

    您是否需要通过
    序列长度作为输入?
    不,绝对没有必要将序列长度作为输入传递,无论是使用固定长度序列还是可变长度序列

    老实说,我不明白为什么代码中的模型在没有发送到任何模型层进行处理的情况下使用这个输入

    这真的是完整的模型吗

    为什么要传递序列长度作为输入? 嗯,也许他们想用这些来进行一些自定义计算。这可能是一个有趣的选项,但是您发布的代码中没有这些计算。这个模型对这种输入毫无作用

    如何使用可变序列长度? 为此,您有两种选择:

    • 如您所述,将序列填充到固定大小,并将
      掩蔽
      层添加到输入(或使用嵌入层中的
      掩蔽_zeros=True
      选项)
    • 使用长度标注作为
      None
      。这是通过以下方法之一完成的:
      • 批次形状=(批次大小,无)
      • 输入_形状=(无,)
      • PS:这些形状用于嵌入层。直接进入循环网络的输入将有一个额外的输入特征的最后维度
    当使用第二个选项(length=None)时,应该分别处理每个批,因为不能将所有长度不同的序列放在同一个numpy数组中。但是模型本身没有限制,在这种情况下不需要填充

    如何使用“无限”长度 使用无限长度的唯一方法是使用
    stateful=True


    在这种情况下,您通过的每一批将不会被视为“另一组序列”,而是“上一批的附加步骤”。

    感谢您的详细回答。很抱歉,我在网络上做了一些编辑,以使其更具可读性,但这个x已经错过了我的注意。该模型可以在SeqLabeling类中找到。我编辑了上面的答案以反映这一点。我猜,如果您查看引用的github repo中的模型,您根本不会更改您的评论。无论如何,关于
    stateful=True
    的最后一点,如果我们谈论序列标记,这是否仍然适用?序列标记的意思是类似于词性标记任务或类似的东西。我不知道序列标记到底是什么。但是
    stateful=True
    是一种在单独批次中输入新“步骤”的方法。(与用于在单独批次中输入新“序列”的
    stateful=False
    相反)----请参阅此处关于有状态与无状态的更多信息:是。。。。我在那个文件中看不到输入的原因。如果那个文件就是全部,那它就没用了。只有当他们决定在某个地方叠加另一个模型,并实际使用该输入进行某些操作时,这才可能变得有用。感谢您提供的详细答案。很抱歉,我在网络上做了一些编辑,使其更具吸引力
    word_ids = Input(batch_shape=(None, None), dtype='int32')
    word_embeddings = Embedding(input_dim=embeddings.shape[0],
                                output_dim=embeddings.shape[1],
                                mask_zero=True,
                                weights=[embeddings])(word_ids)
    x = Bidirectional(LSTM(units=64, return_sequences=True))(word_embeddings)
    x = Dense(64, activation='tanh')(x)
    x = Dense(10)(x)
    sequence_lengths = Input(batch_shape=(None, 1), dtype='int32')
    model = Model(inputs=[word_ids, sequence_lengths], outputs=[x])