Уменьшает ли MaxPooling переоснащение?

Я обучил следующую модель CNN с меньшим набором данных, поэтому она выполняет переоснащение:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))

model.add(Conv2D(32, kernel_size=(3,3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.4))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer=Adam(), metrics=['accuracy'])

Модель имеет много обучаемых параметров (более 3 миллионов, поэтому мне интересно, следует ли мне уменьшить количество параметров с помощью дополнительного MaxPooling, как показано ниже?

Conv - BN - Act - MaxPooling - Conv - BN - Act - MaxPooling - Dropout - Flatten

или с дополнительным MaxPooling и Dropout, как показано ниже?

Conv - BN - Act - MaxPooling - Dropout - Conv - BN - Act - MaxPooling - Dropout - Flatten

Я пытаюсь понять полный смысл MaxPooling и может ли он помочь против переобучения.


person Code Now    schedule 13.01.2020    source источник


Ответы (2)


Переоснащение может произойти, когда ваш набор данных недостаточно велик для размещения вашего количества функций. Максимальное объединение использует максимальную операцию для объединения наборов функций, оставляя вам меньшее их количество. Таким образом, максимальное объединение должно логически уменьшать переобучение.

Исключение снижает зависимость от какой-либо отдельной функции, гарантируя, что эта функция не всегда доступна, заставляя модель искать разные потенциальные подсказки, а не просто придерживаться одной, что легко позволит модели переобучить любой, казалось бы, хороший намек. Следовательно, это также должно помочь уменьшить переобучение.

person Kiara Grouwstra    schedule 13.01.2020
comment
Это значит, вы считаете, что мое второе предложение лучше первого? - person Code Now; 13.01.2020
comment
@CodeNow да, так и должно быть! Все же попробуйте! - person Kiara Grouwstra; 13.01.2020

Вы должны НЕ использовать Max-pooling, чтобы уменьшить переобучение, хотя это оказывает небольшое влияние на это, НО этого небольшого эффекта недостаточно, потому что вы применяете Max-Pooling после сверточных операций, что означает, что функции уже обучены в этом слое, и, поскольку максимальное объединение используется для уменьшения высоты и ширины вывода, это приведет к тому, что функции в следующем слое меньше сверточных операций для обучения, что означает НЕБОЛЬШОЙ ЭФФЕКТ на проблему переобучения, но не решит ее. На самом деле вообще не рекомендуется использовать Пулинг для таких проблем, и вот несколько советов:

  1. Уменьшите количество ваших параметров, потому что очень сложно (не невозможно) найти достаточно данных для обучения 3 миллионов параметров без переобучения.
  2. Используйте методы регуляризации, такие как Drop-out, который, кстати, очень эффективен, или L2-регуляризация и т. д.
  3. 3. НЕ используйте максимальный пул с целью уменьшения переобучения, потому что он используется для уменьшения представления и для того, чтобы сделать сеть немного более устойчивой к некоторым функциям, дальнейшее его использование сделает сеть все более и более устойчивой к некоторым вид фичеров.

Надеюсь, это поможет!

person Warios    schedule 11.02.2020
comment
Было бы также хорошо использовать padding='valid' вместо padding='same'? Не лучше ли отказаться от пакетной нормализации? - person Code Now; 12.02.2020