Зачем использовать такие же отступы с максимальным пулом? - PullRequest
0 голосов
/ 23 января 2019

Проходя учебник по автоэнкодеру в блоге Keras , я увидел, что автор использует такое же заполнение в максимальных пулах слоев в части Convolutional Autoencoder, как показано ниже.

x = MaxPooling2D((2, 2), padding='same')(x)

Может ли кто-нибудь объяснить причину этого? При максимальном объединении мы хотим уменьшить высоту и ширину, но почему здесь используются такие же отступы, которые сохраняют высоту и ширину?

Кроме того, результат этого кода делит размеры вдвое на 2, поэтому такое же заполнение, похоже, не работает.

1 Ответ

0 голосов
/ 23 января 2019

С https://keras.io/layers/convolutional/

"то же самое" приводит к заполнению входа таким образом, чтобы длина выхода была такой же, как у исходного ввода.

С https://keras.io/layers/pooling/

pool_size: целое число или кортеж из 2 целых чисел, коэффициенты для уменьшения (вертикальное, горизонтальное).(2, 2) уменьшит вдвое входные данные в обоих пространственных измерениях.Если указано только одно целое число, для обоих измерений будет использоваться одна и та же длина окна.

Итак, сначала давайте начнем с вопроса, зачем вообще использовать заполнение?В контексте сверточного ядра это важно, поскольку мы не хотим пропустить каждый пиксель, находящийся в «центре» ядра.На краях / углах изображения, которое ищет ядро, может быть важное поведение.Таким образом, мы добавляем Conv2D по краям, и в результате он возвращает тот же размер вывода, что и для ввода.

Однако в случае слоя MaxPooling2D мы выполняем заполнение по тем же причинам, но размер шага влияетпо вашему выбору размера пула.Поскольку ваш размер пула равен 2, ваше изображение будет делиться пополам каждый раз, когда вы проходите через слой пула.

input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

Так в случае с вашим учебным примером;размеры вашего изображения изменятся на 28-> 14-> 7-> 4, где каждая стрелка будет представлять слой пула.

...