Объясните разницу между padding='valid' и padding='same'.
Параметр padding в сверточных нейронных сетях (CNN) управляет тем, как обрабатываются границы входного изображения при применении свёртки. Это напрямую влияет на размер выходной карты признаков (feature map). Два наиболее распространённых значения этого параметра — valid и same.
1. Padding: что это такое
Свертка требует сканировать входное изображение ядром фиксированного размера (например, 3×3). При этом, если не использовать паддинг, ядро не сможет «зайти» за границы изображения, и выход будет меньше по размеру, чем вход.
Чтобы сохранить пространственные размеры, вокруг изображения добавляют нуль-паддинг (zero-padding): обрамляют изображение нулями (или другим значением) по краям.
2. padding='valid'
Что значит:
-
Без паддинга. Никакие дополнительные пиксели не добавляются.
-
Свертка применяется только к тем позициям, где ядро полностью помещается внутри входного изображения.
Формула размера выходного тензора:
Пусть:
-
Win,HinW_{in}, H_{in} — ширина и высота входа
-
FF — размер ядра (фильтра)
-
SS — шаг (stride)
-
PP — паддинг (в случае valid → 0)
Тогда выходной размер:
Wout=⌊Win−FS+1⌋W_{out} = \\left\\lfloor \\frac{W_{in} - F}{S} + 1 \\right\\rfloor Hout=⌊Hin−FS+1⌋H_{out} = \\left\\lfloor \\frac{H_{in} - F}{S} + 1 \\right\\rfloor
Пример:
Вход: 28×28
Ядро: 3×3
Stride: 1
padding='valid'
→ выход:
(28−3)/1+1=26(28 - 3)/1 + 1 = 26
→ выходной размер: 26×26
Особенности:
- Размер **уменьшается
** -
Потеря информации по краям (границы не обрабатываются)
-
Используется, когда нужно уменьшить размер признаков, или при декодировании (например, в автоэнкодерах)
3. padding='same'
Что значит:
-
Добавляется столько нулей по краям, чтобы сохранить размер входа после свёртки.
-
Свертка применима даже к граничным пикселям.
Цель:
Wout=Win,Hout=HinW_{out} = W_{in}, \\quad H_{out} = H_{in}
Формула паддинга:
Для stride = 1:
P=⌊F−12⌋P = \\left\\lfloor \\frac{F - 1}{2} \\right\\rfloor
Если шаг больше 1 или размер фильтра чётный, паддинг подбирается так, чтобы:
Wout=⌈WinS⌉W_{out} = \\left\\lceil \\frac{W_{in}}{S} \\right\\rceil
Пример:
Вход: 28×28
Ядро: 3×3
Stride: 1
padding='same'
→ Паддинг:
P=⌊3−12⌋=1P = \\left\\lfloor \\frac{3 - 1}{2} \\right\\rfloor = 1
Добавляется по 1 пикселю с каждой стороны → вход становится 30×30, а свёртка 3×3 снова даёт выход 28×28.
Особенности:
- **Сохраняет размер карты признаков
** -
Краевые пиксели также участвуют в обучении
-
Применяется в большинстве CNN-архитектур, особенно если требуется **сохранить пространственную структуру
**
4. Влияние stride и filter size на padding
Если stride > 1, то same не обязательно даёт точное совпадение размеров входа и выхода, но гарантирует минимальную потерю покрытия:
Пример:
-
Вход: 32×32
-
Ядро: 3×3
-
Stride: 2
-
padding='same'
→ Выход:
⌈322⌉=16\\left\\lceil \\frac{32}{2} \\right\\rceil = 16
Добавляется 1 пиксель нулей по каждой стороне, чтобы обеспечить полное покрытие.
5. Сравнение valid vs same
Параметр | padding='valid' | padding='same' |
---|---|---|
Паддинг | Нет (P = 0) | Автоматический, зависит от фильтра |
--- | --- | --- |
Размер выхода | Меньше входа | Такой же, как вход |
--- | --- | --- |
Потеря информации по краям | Да | Нет (границы включены) |
--- | --- | --- |
Быстродействие | Быстрее (меньше вычислений) | Медленнее (добавляются пиксели) |
--- | --- | --- |
Использование | В downsampling (ResNet, AutoEnc) | В feature extraction (UNet, VGG, etc.) |
--- | --- | --- |
6. Padding в фреймворках
TensorFlow / Keras:
Conv2D(filters=64, kernel_size=3, padding='same') # сохраняет размер
Conv2D(filters=64, kernel_size=3, padding='valid') # уменьшает размер
PyTorch:
В PyTorch явно указывается размер паддинга (padding=N). Нет ключевого слова 'same', но с версии 1.9 добавлена опция padding='same'.
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) # аналог same
nn.Conv2d(..., padding=0) # аналог valid
Также можно вручную рассчитать padding:
padding = (kernel_size - 1) // 2
7. Padding и свёрточные архитектуры
-
В архитектурах, где важно сохранить размер (например, U-Net или Fully Convolutional Networks), обычно используют padding='same', чтобы можно было точно объединять признаки (skip connections).
-
В ResNet обычно сочетают padding='same' с последующим pooling/stride для уменьшения размерности.
-
В AutoEncoder или GAN для downsampling часто используется padding='valid', чтобы размер изображения постепенно уменьшался.
8. Геометрическая интерпретация
-
valid → свертка «шагает» по изображению только в пределах рамки, не заходя за границы.
-
same → свертка «разрешается» немного выходить за границы, а недостающие значения компенсируются нулями (или другим паддингом).
Это похоже на то, как маленький фильтр не может обработать край окна без добавления рамки.
9. Общие рекомендации
-
Для глубоких сверточных сетей, где важна глубина признаков, используйте padding='same'
-
Для объединения признаков из разных уровней (например, skip connections), обязательно используйте same, чтобы размеры совпадали
-
Для задач, где важна сжатая репрезентация (downsampling), valid может быть уместным
-
При построении симметричных архитектур (например, автоэнкодеры, UNet) предпочтительно использовать same, чтобы избежать рассогласования размеров
padding='valid' и padding='same' определяют стратегию обработки границ изображения при свёртке и оказывают влияние на форму выходных признаков, скорость вычислений, а также возможность построения определённых архитектур и типов слоёв. Их правильное использование — важная часть проектирования эффективных нейронных сетей в задачах компьютерного зрения.