使用Dropout与Keras和LSTM / GRU单元

时间:2018-06-06 12:40:47

标签: keras lstm dropout

在Keras中,你可以像这样指定一个辍学层:

model.add(Dropout(0.5))

但是使用GRU单元格,您可以将dropout指定为构造函数中的参数:

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

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

Keras' documentation中,它将其添加为单独的dropout图层(请参阅“使用LSTM进行序列分类”)

1 个答案:

答案 0 :(得分:10)

重复图层反复执行相同的重复操作。

在每个时间步中,需要两个输入:

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

请注意,输入和输出的尺寸可能不匹配,这意味着"您的输入"尺寸不匹配"循环输入(前一步/状态)" dimesions。

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

  • 一个内核应用于"您的输入"在兼容的维度中处理和转换它
  • 另一个(由keras称为recurrent kernel)应用于上一步的输入。

因此,keras还在循环图层中使用了两个丢失操作。 (将应用于每个步骤的辍学)

  • 首次转换输入的辍学
  • 应用经常性内核的辍学

因此,实际上RNN层中有两个丢失参数:

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

您可以在GRUCellLSTMCell中看到此说明编码,例如source code

什么是正确的?

这对创造力是开放的。

您可以使用Dropout(...)图层,但不是"错误",但它可能会丢失"时间步长"太! (除非您正确设置noise_shape或使用SpatialDropout1D(目前尚未记录)

也许你想要它,也许你不想。如果使用循环图层中的参数,则只会将丢失应用于其他维度,而不会丢弃任何一个步骤。这对于复发层似乎是健康的,除非您希望您的网络学习如何处理包含间隙的序列(这最后一句话是一个支持)。

此外,使用dropout参数,你将真正丢弃部分内核,因为操作被删除"在每一步",而使用单独的层将让你的RNN在内部执行非删除操作,因为你的辍学只会影响最终的输出。