Kerasでは、次のようにドロップアウトレイヤーを指定できます。
model.add(Dropout(0.5))
ただし、GRUセルを使用すると、ドロップアウトをコンストラクターのパラメーターとして指定できます。
model.add(GRU(units=512,
return_sequences=True,
dropout=0.5,
input_shape=(None, features_size,)))
違いは何ですか?どちらか一方の方が好ましいですか?
Kerasのドキュメント では、個別のドロップアウトレイヤーとして追加されます(「LSTMによるシーケンス分類」を参照)
再発層は同じ繰り返し操作を繰り返し実行します。
各タイムステップで、2つの入力を受け取ります。
入力と出力の寸法が一致しない場合があることに注意してください。つまり、「入力」の寸法は「繰り返し入力(前のステップ/状態)」の寸法と一致しません。
次に、すべての反復タイムステップで、2つの異なるカーネルを使用する2つの操作があります。
このため、kerasは再発層で2つのドロップアウト操作も使用します。 (すべてのステップに適用されるドロップアウト)
したがって、実際には、RNNレイヤーには2つのドロップアウトパラメーターがあります。
dropout
、入力の最初の操作に適用されますrecurrent_dropout
_、繰り返し入力(以前の出力または状態、あるいはその両方)の他の操作に適用されますこの説明は、GRUCell
とLSTMCell
のいずれかで、たとえば ソースコード でコード化して確認できます。
何が正しいですか?
これは創造性に開かれています。
Dropout(...)
レイヤーを使用できます。「間違っている」わけではありませんが、「タイムステップ」もドロップする可能性があります。 (_noise_shape
_を適切に設定するか、現在ドキュメント化されていない_SpatialDropout1D
_を使用しない限り)
多分あなたはそれを望んでいるのかもしれないし、多分あなたは望んでいないのかもしれません。リカレントレイヤーのパラメーターを使用する場合、ドロップアウトを他のディメンションにのみ適用し、1つのステップをドロップすることはありません。ギャップを含むシーケンスの処理方法をネットワークに学習させない限り、これは再帰レイヤーにとっては健全なようです(この最後の文は仮説です)。
また、ドロップアウトパラメーターを使用すると、「すべてのステップで」操作がドロップされるため、カーネルの一部が実際にドロップされますが、個別のレイヤーを使用すると、RNNはドロップされていない操作を内部で実行できます。最終出力。