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

与Keras和LSTM/GRU单元一起使用Dropout

  •  7
  • BigBadMe  · 技术社区  · 8 年前

    在Keras中,可以指定一个辍学层,如下所示:

    model.add(Dropout(0.5))
    

    但使用GRU单元格,可以在构造函数中将辍学指定为参数:

    model.add(GRU(units=512,
            return_sequences=True,
            dropout=0.5,
            input_shape=(None, features_size,)))
    

    有什么区别?一个比另一个好吗?

    在 Keras' documentation 它将其添加为一个单独的辍学层(参见“LSTM序列分类”)。

    1 回复  |  直到 8 年前
        1
  •  11
  •   Daniel Möller    8 年前

    复发层反复进行同样的手术。

    在每个时间步中,它接受两个输入:

    • 你的输入(序列的一个步骤)
    • 内部输入(例如,可以是状态和上一步的输出)

    请注意,输入和输出的维度可能不匹配,这意味着“您的输入”维度将与“重复输入(上一步/状态)”维度不匹配。

    然后,在每个循环时间步中,有两个具有两个不同内核的操作:

    • 一个内核被应用到“你的输入”中,在一个兼容的维度中处理和转换它
    • 另一个(keras称为递归核)应用于前一步的输入。

    因此,Keras在重复层中也使用了两个退出操作。(将应用于每个步骤的退出)

    • 第一次转换输入时的退出
    • 递归核的应用

    因此,实际上RNN层中有两个辍学参数:

    • dropout ,应用于对输入的第一个操作
    • recurrent_dropout ,适用于对经常性输入(以前的输出和/或状态)的其他操作

    您可以在 GRUCell 而在 LSTMCell 例如在 source code .


    什么是正确的?

    这是开放的创造力。

    你可以用 Dropout(...) 层,这不是“错误”,但它可能会下降“时间步”太!(除非你设置 noise_shape 适当地或使用 SpatialDropout1D ,目前尚未记录)

    也许你想要,也许你不想要。如果在重复层中使用参数,则将仅对其他维度应用辍学,而不删除一个步骤。这对于反复出现的层似乎是健康的,除非您希望您的网络学习如何处理包含间隙的序列(最后一句话是supposal)。

    此外,使用dropout参数,您将真正删除部分内核,因为操作是“每一步”删除的,而使用单独的层将允许您的rnn在内部执行不删除的操作,因为您的dropout将只影响最终输出。