Повторяющиеся слои выполняют одну и ту же повторную операцию снова и снова.
На каждом временном шаге требуется два входа:
- Ваши входы (шаг вашей последовательности)
- Внутренние входы (например, состояния и выход предыдущего шага)
Обратите внимание, что размеры входа и выхода могут не совпадать, что означает, что «ваш вход»измерения не будут совпадать с измерениями «рекуррентный ввод (предыдущий шаг / состояния)».
Тогда на каждом повторяющемся временном шаге выполняются две операции с двумя разными ядрами:
- Применяется одно ядрочтобы «ваши входы» обрабатывать и преобразовывать его в совместимом измерении
- Другое (называемое keras рекуррентным ядром) применяется к входам предыдущего шага.
Из-за этогоКерас также использует две операции удаления в повторяющихся слоях.(Выпадения, которые будут применяться к каждому шагу)
- Выпадение при первом преобразовании ваших входных данных
- Выпадение при применении рекуррентного ядра
Таким образом, на самом деле в слоях RNN есть два выпадающих параметра:
dropout
, примененные к первой операции на входах recurrent_dropout
, примененные к другимработа с рекуррентными входами (предыдущий выход и / или состояния)
Это описание можно кодировать либо в GRUCell
, либо в LSTMCell
, например, в исходном коде .
Что правильно?
Это открыто для творчества.
Вы можете использовать слой Dropout(...)
, он не «неправильный», но, возможно, также пропустит «временные шаги»!(Если вы не установите noise_shape
правильно или не используете SpatialDropout1D
, что в настоящее время еще не задокументировано)
Может быть, вы хотите, а может и нет.Если вы используете параметры в повторяющемся слое, вы будете применять выпадения только к другим измерениям, не пропуская ни одного шага.Это кажется полезным для повторяющихся слоев, если только вы не хотите, чтобы ваша сеть научилась работать с последовательностями, содержащими пропуски (это последнее предложение является справочным).
Кроме того, с параметрами выпадения вы будете действительно отбрасывать частиядро, так как операции отбрасываются «на каждом шаге», а использование отдельного уровня позволит вашему RNN выполнять внутренние операции без отбрасывания, поскольку выпадение будет влиять только на конечный результат.