Архитектура CNN и что «видят» её слои
Собираем всё вместе: как из свёрток, пулинга и полносвязных слоёв получается сеть, которая видит объекты.
CNN (Convolutional Neural Network) — нейросеть, чередующая свёрточные слои и пулинг для извлечения признаков, а в конце использующая полносвязные слои для принятия решения.
Две части сети
Классическая CNN состоит из двух логических частей:
- Извлечение признаков (feature extractor): чередующиеся блоки «свёртка → ReLU → пулинг». На входе сырые пиксели, на выходе — компактный набор карт признаков, описывающих картинку на уровне понятий.
- Классификатор (head): карты «разворачивают» в вектор и подают в один-два полносвязных слоя, которые выдают вероятности классов.
Вход 224x224x3
-> [Свёртка -> ReLU -> Пулинг] карты признаков уменьшаются
-> [Свёртка -> ReLU -> Пулинг]
-> [Свёртка -> ReLU -> Пулинг]
-> Развернуть в вектор (flatten)
-> Полносвязный слой
-> Softmax: [кошка 0.92, собака 0.06, ...]
Полносвязные слои здесь уместны: они работают уже не с миллионами пикселей, а с компактным набором высокоуровневых признаков, поэтому проблемы из урока 4.1 не возникает.
Иерархия: от краёв к объектам
Самое красивое в CNN — что «видят» её слои, если заглянуть внутрь. Признаки выстраиваются в иерархию от простого к сложному:
| Глубина слоя | Что выучивают фильтры |
| Первые слои | края, простые линии, пятна цвета |
| Средние слои | текстуры, углы, узоры, части (глаз, колесо) |
| Поздние слои | целые объекты и их сочетания (морда, лицо, машина) |
Сеть никто не учил этой иерархии напрямую — она возникает сама. Ранние слои детектируют то же, что классический Собель (границы!), но дальше комбинируют простые признаки во всё более сложные. Это перекликается с тем, как устроена зрительная кора мозга.
Финальный шаг: softmax
На выходе сеть даёт по числу для каждого класса (логиты). Их превращают в вероятности функцией softmax: большие числа становятся большими вероятностями, всё суммируется в единицу. Покажем на маленьком примере.
import math
scores = {"кошка": 2.0, "собака": 1.0, "птица": 0.1}
exps = {k: math.exp(v) for k, v in scores.items()}
total = sum(exps.values())
for k in scores:
p = exps[k] / total
print(f"{k:7}: {p * 100:5.1f}%")
print("Прогноз:", max(scores, key=scores.get))
Вывод:
кошка : 65.9% собака : 24.2% птица : 9.9% Прогноз: кошка
Сеть «уверена» на 65.9%, что это кошка. Softmax превратил сырые отклики в понятные вероятности, и выбирается класс с наибольшей.
Итог
- CNN = извлечение признаков (свёртки+пулинг) + классификатор (полносвязные слои).
- Полносвязные слои в конце работают с компактными признаками, а не с пикселями.
- Слои образуют иерархию: края → части → объекты, и она возникает сама.
- Softmax превращает отклики в вероятности классов.