Пулинг: уменьшаем карту, сохраняя суть

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

Пулинг (pooling) — операция уменьшения размера карты признаков: окрестность пикселей заменяется одним значением (максимумом или средним).

Идея: огрубление

Карта признаков говорит, где сработал фильтр. Но точное положение «вертикальная граница в пикселе (47, 102)» избыточно — важно лишь, что граница примерно тут есть. Пулинг огрубляет карту: делит её на блоки (например, 2×2) и каждый блок сворачивает в одно число. Карта 4×4 становится 2×2 — в 4 раза меньше значений.

Max- и avg-пулинг руками

Два варианта: max-пулинг берёт максимум блока (есть ли тут сильный отклик?), avg-пулинг — среднее (какой отклик в среднем). На практике чаще берут максимум.

image = [
    [1, 3, 2, 4],
    [5, 6, 1, 2],
    [7, 2, 3, 0],
    [1, 2, 9, 4],
]

def pool(img, mode):
    H, W = len(img), len(img[0])
    out = []
    for y in range(0, H, 2):
        row = []
        for x in range(0, W, 2):
            block = [img[y][x], img[y][x + 1], img[y + 1][x], img[y + 1][x + 1]]
            row.append(max(block) if mode == "max" else round(sum(block) / 4))
        out.append(row)
    return out

print("Исходник 4x4 -> 2x2 после пулинга 2x2")
print("max-pooling:")
for r in pool(image, "max"):
    print(r)
print("avg-pooling:")
for r in pool(image, "avg"):
    print(r)

Вывод:

Исходник 4x4 -> 2x2 после пулинга 2x2
max-pooling:
[6, 4]
[7, 9]
avg-pooling:
[4, 2]
[3, 4]

Левый-верхний блок [1,3,5,6]: max-пулинг дал 6 (самый сильный отклик), avg-пулинг — 4 (среднее (1+3+5+6)/4). Карта ужалась с 4×4 до 2×2.

Зачем это нужно

  • Меньше вычислений: карты сжимаются, следующим слоям работать легче.
  • Устойчивость к сдвигу (инвариантность): если объект чуть сдвинулся, максимум в блоке, скорее всего, не изменится — сеть меньше реагирует на точное положение.
  • Рост «поля зрения»: после пулинга один пиксель карты охватывает большую область исходной картинки. Глубокие слои начинают видеть крупные структуры, а не отдельные пиксели.

Чередование свёртки и пулинга

Типичная CNN чередует: свёртка (выделить признаки) → ReLU (нелинейность) → пулинг (огрубить и сжать) → снова свёртка, и так несколько раз. С каждым блоком карта становится меньше по размеру, но глубже по числу каналов — от «многих пикселей, мало смысла» к «мало точек, много смысла». Это подводит нас к полной архитектуре CNN.

Итог

  • Пулинг сжимает карту признаков, заменяя блок одним числом.
  • Max-пулинг берёт максимум (чаще всего), avg — среднее.
  • Даёт экономию вычислений, устойчивость к сдвигу и рост поля зрения.
  • CNN чередует свёртку, ReLU и пулинг: карта мельчает, но «умнеет».
Проверьте себя
1. Что делает max-пулинг 2×2 с блоком пикселей?
AСкладывает все четыре значения
BЗаменяет блок его максимальным значением, уменьшая карту в 4 раза по площади
CИнвертирует значения
DУдваивает размер карты
2. Какое полезное свойство даёт пулинг помимо экономии вычислений?
AДобавляет цвет
BУстойчивость к небольшому сдвигу объекта: максимум в блоке мало меняется
CУвеличивает число параметров
DПовышает разрешение
3. Как меняются карты признаков по мере углубления в типичную CNN?
AРастут по размеру и теряют каналы
BУменьшаются по размеру, но углубляются по числу каналов — от пикселей к смыслу
CОстаются неизменными
DПревращаются обратно в RGB
Поддержать проект