Как понять SpatialDropout1D и когда его использовать? - PullRequest
0 голосов
/ 17 мая 2018

Иногда я вижу, что некоторые модели используют SpatialDropout1D вместо Dropout. Например, в части нейронной сети тегирования речи они используют:

model = Sequential()
model.add(Embedding(s_vocabsize, EMBED_SIZE,
                    input_length=MAX_SEQLEN))
model.add(SpatialDropout1D(0.2)) ##This
model.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2))
model.add(RepeatVector(MAX_SEQLEN))
model.add(GRU(HIDDEN_SIZE, return_sequences=True))
model.add(TimeDistributed(Dense(t_vocabsize)))
model.add(Activation("softmax"))

Согласно документации Кераса, написано:

Эта версия выполняет ту же функцию, что и Dropout, однако она выпадает целые карты объектов 1D вместо отдельных элементов.

Однако я не могу понять значение entrie 1D feature . Более конкретно, я не могу визуализировать SpatialDropout1D в той же модели, которая описана в quora . Может ли кто-нибудь объяснить эту концепцию, используя ту же модель, что и в quora?

Кроме того, при какой ситуации мы будем использовать SpatialDropout1D вместо Dropout?

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Чтобы упростить это, я бы сначала отметил, что так называемые карты объектов (1D, 2D и т. Д.) - это наши обычные каналы. Давайте посмотрим на примеры:

  1. Dropout(): определим 2D-вход: [[1, 1, 1], [2, 2, 2]]. Выпадение будет рассматривать каждый элемент независимо, и может привести к чему-то вроде [[1, 0, 1], [0, 2, 2]]

  2. SpatialDropout1D(): В этом случае результат будет выглядеть как [[1, 0, 1], [2, 0, 2]]. Обратите внимание, что 2-й элемент был обнулен вдоль всех каналов.

0 голосов
/ 17 мая 2018

Форма шума

Чтобы понять SpatialDropout1D, вы должны привыкнуть к понятию формы шума .При простом ванильном выпадении каждый элемент сохраняется или сбрасывается независимоНапример, если тензор [2, 2, 2], каждый из 8 элементов может быть обнулен в зависимости от случайного подбрасывания монеты (с определенной вероятностью "головок");всего будет 8 независимых подбрасываний монет, и любое количество значений может стать нулевым, от 0 до 8.

Иногда возникает необходимость сделать что-то большее.Например, может потребоваться сбросить весь срез вдоль оси 0.noise_shape в этом случае - [1, 2, 2], и выпадение включает только 4 независимых случайных броска монеты.Первый компонент будет либо храниться вместе, либо удаляться вместе.Число обнуленных элементов может быть 0, 2, 4, 6 или 8.Это не может быть 1 или 5.

Другой способ увидеть это состоит в том, чтобы представить, что входной тензор на самом деле [2, 2], но каждое значение имеет двойную точность (или многократную точность).Вместо того, чтобы сбрасывать байты в середине, слой сбрасывает полное многобайтовое значение.

Почему это полезно?

Пример выше приведен только для иллюстрации и не является обычным в реальной жизни.Приложения.Более реалистичный пример: shape(x) = [k, l, m, n] и noise_shape = [k, 1, 1, n].В этом случае каждый пакет и компонент канала будут храниться независимо, но каждая строка и столбец будут сохраняться или не храниться вместе.Другими словами, целом [l, m] карта объектов будет либо сохранена, либо отброшена.

Вы можете сделать это, чтобы учесть корреляцию соседних пикселей, особеннов ранних сверточных слоях.По сути, вы хотите предотвратить совместную адаптацию пикселей с соседями по картам объектов и заставить их учиться, как если бы не было других карт объектов.Это именно то, что делает SpatialDropout2D: он продвигает независимость между картами объектов.

SpatialDropout1D очень похож: учитывая shape(x) = [k, l, m], он использует noise_shape = [k, 1, m] и отбрасывает все карты одномерных объектов.

Ссылка: Эффективная локализация объектов с использованием сверточных сетей Джонатан Томпсон (Alon.

)
...