Свёрточные сети (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 для классификации.