在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进行序列分类”)
答案 0 :(得分:10)
重复图层反复执行相同的重复操作。
在每个时间步中,需要两个输入:
请注意,输入和输出的尺寸可能不匹配,这意味着"您的输入"尺寸不匹配"循环输入(前一步/状态)" dimesions。
然后在每个循环时间步中,有两个操作有两个不同的内核:
因此,keras还在循环图层中使用了两个丢失操作。 (将应用于每个步骤的辍学)
因此,实际上RNN层中有两个丢失参数:
dropout
,适用于输入的第一个操作recurrent_dropout
,应用于经常性输入的其他操作(先前的输出和/或状态)您可以在GRUCell
和LSTMCell
中看到此说明编码,例如source code。
什么是正确的?
这对创造力是开放的。
您可以使用Dropout(...)
图层,但不是"错误",但它可能会丢失"时间步长"太! (除非您正确设置noise_shape
或使用SpatialDropout1D
(目前尚未记录)
也许你想要它,也许你不想。如果使用循环图层中的参数,则只会将丢失应用于其他维度,而不会丢弃任何一个步骤。这对于复发层似乎是健康的,除非您希望您的网络学习如何处理包含间隙的序列(这最后一句话是一个支持)。
此外,使用dropout参数,你将真正丢弃部分内核,因为操作被删除"在每一步",而使用单独的层将让你的RNN在内部执行非删除操作,因为你的辍学只会影响最终的输出。