Пулинг: уменьшаем карту, сохраняя суть
После свёртки карты признаков большие. Пулинг ужимает их, оставляя главное и делая сеть устойчивее.
Пулинг (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 и пулинг: карта мельчает, но «умнеет».