правильный порядок для SpatialDropout2D, BatchNormalization и функции активации? - PullRequest
1 голос
/ 07 января 2020

Для архитектуры CNN я хочу использовать слой SpatialDropout2D вместо слоя Dropout. Кроме того, я хочу использовать BatchNormalization. До сих пор я всегда устанавливал BatchNormalization непосредственно после сверточного слоя, но до функции активации, как в статье, упомянутой Иоффе и Сегеди. Слои выпадения, которые я всегда устанавливал после слоя MaxPooling2D.

In https://machinelearningmastery.com/how-to-reduce-overfitting-with-dropout-regularization-in-keras/ SpatialDropout2D устанавливается непосредственно после сверточного слоя.

Я нахожу это довольно запутанным, в каком порядке я Теперь следует применить эти слои. Я также прочитал на странице Keras, что SpatialDropout должен быть расположен непосредственно за ConvLayer (но я больше не могу найти эту страницу).

Правильно ли следующий порядок?

ConvLayer - SpatialDropout - BatchNormalization - Функция активации - MaxPooling

Я очень надеюсь на советы и заранее благодарю

Обновление Моя цель состояла в том, чтобы на самом деле обменяться в следующем выпадающем списке архитектуры CNN для пространственного отсева :

model = Sequential()
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(10))
model.add(Activation('softmax'))

1 Ответ

2 голосов
/ 07 января 2020

Dropout vs BatchNormalization - проблема стандартного отклонения

При смешивании этих слоев возникает большая проблема, особенно когда BatchNormalization сразу после Dropout.

Выпадения пытаются сохранить то же самое среднее значение выходов без пропусков, но это меняет стандартное отклонение, что приведет к огромной разнице в BatchNormalization между обучением и проверкой. (Во время обучения BatchNormalization получает измененные стандартные отклонения, накапливает и сохраняет их. Во время проверки выпадения отключаются, стандартное отклонение больше не является измененным, а исходным. Но BatchNormalization, поскольку оно находится в процессе проверки , не будет использовать статистику пакета, но сохраненную статистику, которая будет сильно отличаться от статистики пакета)

Итак, первое и самое важное правило: не ставьте BatchNormalization после Dropout (или SpatialDropout).

Обычно я пытаюсь оставить по крайней мере два сверточных / плотных слоя без выпадения перед применением пакетной нормализации, чтобы избежать этого.

Dropout vs BatchNormalization - изменение нулей на другое значение

Также важно: роль Dropout состоит в том, чтобы «обнулить» влияние некоторых весов следующего слоя. Если вы примените нормализацию после отсева, у вас больше не будет «нулей», а будет определенное значение, которое будет повторяться для многих единиц. И это значение будет варьироваться от партии к партии. Таким образом, несмотря на добавленный шум, вы не убиваете юнитов, как это должно делать чистое выпадение.

Dropout vs MaxPooling

Проблема использования обычного Dropout перед MaxPooling состоит в том, что вы обнуляете несколько пикселей, а затем MaxPooling примет максимальное значение, отсортируйте игнорировать часть вашего отсева. Если у вас выпадет максимум пикселя, то объединение приведет ко второму максимуму, а не к нулю.

Итак, Dropout до MaxPooling снижает эффективность отсева.

SpatialDropout против MaxPooling

Но SpatialDropout никогда не попадает в «пиксели», а только в каналы. Когда он попадает в канал, он обнуляет все пиксели для этого канала, таким образом, MaxPooling также эффективно приведет к нулю.

Таким образом, нет разницы между пространственным выпадением до или после объединения. Целый «канал» будет нулевым в обоих порядках.

BatchNormalization vs Activation

В зависимости от функции активации, использование нормализации партии до того, как это может быть хорошим преимуществом.

Для активации 'relu' нормализация делает модель отказоустойчивой на случай неудачи «все нули замораживают реляционный слой». Это также гарантирует, что половина единиц будет равна нулю, а другая половина будет линейной.

Для 'sigmoid' или 'tahn' BatchNormalization гарантирует, что значения находятся в допустимом диапазоне, избегая градиентов насыщения и исчезновения (значения, которые находятся слишком далеко от нуля, будут почти плоскими область этих функций, вызывающая исчезающие градиенты).

Есть люди, которые говорят, что есть и другие преимущества, если вы сделаете наоборот, я не полностью осознаю эти преимущества, мне нравятся те, которые я очень упомянул.

Dropout vs Activation

С 'relu' нет никакой разницы, можно доказать, что результаты в точности совпадают.

С активациями, которые не центрированы, например, 'sigmoid', помещая выпадение перед активацией, приведет не к "нулям", а к другим значениям. Для сигмоида окончательные результаты отсева до него будут 0,5.

Если вы добавите, например, 'tanh' после отсева, у вас будут нули, но масштабирование, которое выпадает для сохранения того же среднего значения, будет искажено таном. (Я не знаю, если это большая проблема, но может быть)

MaxPooling vs Activation

Я не вижу здесь много. Если активация не очень странная, конечный результат будет таким же.

Выводы?

Есть возможности, но некоторые хлопотны. Я считаю следующий порядок хорошим и часто им пользуюсь

Я бы сделал что-то вроде

  • Group1
    • Conv
    • BatchNorm
    • Активация
    • MaxPooling
    • Dropout или SpatialDropout
  • Group2
    • Conv
    • ---- - (в последней группе был выпадение, здесь нет BatchNorm)
    • Активация
    • MaxPooling
    • Dropout или SpatialDropout (решите использовать или нет)
  • После двух групп без выпадения
    • можно снова использовать BatchNorm
...