С 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, где каждая стрелка будет представлять слой пула.