Свёрточные сети (CNN)

Урок объясняет свёрточные сети — стандарт для картинок — и слои Conv2D и MaxPooling.

Свёрточная сеть (CNN) — это сеть, где маленькие фильтры скользят по картинке и выделяют локальные признаки (края, текстуры, формы), переиспользуя одни и те же веса по всему изображению.

Если развернуть картинку в вектор и кормить Dense, сеть теряет информацию о соседстве пикселей и получает миллионы параметров. CNN решает обе проблемы: фильтр смотрит на локальное окно и использует одни веса везде. Поэтому именно CNN — основа компьютерного зрения.

Что такое свёртка

Фильтр (ядро) — маленькая матрица, например 3×3. Она «прикладывается» к участку картинки, перемножается поэлементно и суммируется — получается одно число. Сдвигая фильтр по всей картинке, получаем карту признаков. Посчитаем одну позицию свёртки на Python — код запускается:

# участок картинки 3x3
patch = [[1, 0, 1],
         [0, 1, 0],
         [1, 0, 1]]
# фильтр 3x3 (детектор диагонали)
kernel = [[1, 0, 0],
          [0, 1, 0],
          [0, 0, 1]]

value = sum(patch[i][j] * kernel[i][j] for i in range(3) for j in range(3))
print("отклик фильтра:", value)

Вывод:

отклик фильтра: 3

Высокий отклик означает, что фильтр «нашёл» свой узор (здесь — диагональ из единиц).

Пулинг (subsampling)

MaxPooling уменьшает карту признаков, оставляя максимум из каждого окна — так сеть становится устойчивее к сдвигам и легче считается. Возьмём максимум из окна 2×2:

window = [[1, 3],
          [2, 9]]
max_val = max(window[i][j] for i in range(2) for j in range(2))
print("max-pooling 2x2:", max_val)

Вывод:

max-pooling 2x2: 9

CNN в Keras

Типичная архитектура: чередование Conv2D и MaxPooling, затем Flatten и Dense (требует TF):

from tensorflow.keras import layers

model = tf.keras.Sequential([
    layers.Conv2D(32, (3, 3), activation="relu", input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation="relu"),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation="relu"),
    layers.Dense(10, activation="softmax"),
])

Поток данных в CNN

картинка (28,28,1)
   -> Conv2D(32)  -> (26,26,32)   признаки: края
   -> MaxPool     -> (13,13,32)   ужали вдвое
   -> Conv2D(64)  -> (11,11,64)   признаки: формы
   -> MaxPool     -> (5,5,64)
   -> Flatten     -> (1600,)
   -> Dense(10)   -> вероятности классов

Как работает под капотом

Главная идея — совместное использование весов: один фильтр из 9 чисел (3×3) применяется ко всей картинке, а не по отдельному весу на каждый пиксель. Это резко сокращает число параметров и встраивает в сеть знание «один и тот же узор может встретиться где угодно». Ранние слои ловят простые края, глубокие — комбинируют их в сложные формы (глаз, колесо, цифру).

Частые ошибки

  • Забыть канал. Conv2D ждёт форму (H, W, каналы); для ч/б MNIST нужно (28, 28, 1).
  • Не ставить Flatten перед Dense. После свёрток выход 3-мерный, его надо развернуть.
  • Использовать Dense вместо CNN для картинок. Это даёт лишние параметры и теряет пространственную структуру.

Итог

  • CNN — стандарт для изображений: фильтры скользят по картинке и выделяют локальные признаки.
  • Conv2D извлекает признаки, MaxPooling уменьшает карту и добавляет устойчивость.
  • Веса фильтра переиспользуются по всей картинке — мало параметров, учёт пространства.
  • В конце — Flatten и Dense для классификации.
Проверьте себя
1. Главное преимущество CNN над Dense для картинок?
ACNN быстрее загружает данные
BФильтры переиспользуют веса и учитывают соседство пикселей, экономя параметры
CCNN не требует обучения
DCNN не нуждается в активациях
2. Что делает слой MaxPooling2D?
AУвеличивает картинку
BБерёт максимум из окна, уменьшая карту признаков и добавляя устойчивость к сдвигам
CСчитает softmax
DДобавляет каналы
3. Зачем нужен Flatten между свёртками и Dense?
AЧтобы нормализовать данные
BЧтобы развернуть 3-мерный выход свёрток в вектор для Dense
CЧтобы добавить dropout
DЧтобы увеличить число фильтров