Архитектура CNN и что «видят» её слои

Собираем всё вместе: как из свёрток, пулинга и полносвязных слоёв получается сеть, которая видит объекты.

CNN (Convolutional Neural Network) — нейросеть, чередующая свёрточные слои и пулинг для извлечения признаков, а в конце использующая полносвязные слои для принятия решения.

Две части сети

Классическая CNN состоит из двух логических частей:

  1. Извлечение признаков (feature extractor): чередующиеся блоки «свёртка → ReLU → пулинг». На входе сырые пиксели, на выходе — компактный набор карт признаков, описывающих картинку на уровне понятий.
  2. Классификатор (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 превращает отклики в вероятности классов.
Проверьте себя
1. На какие две логические части делится классическая CNN?
AКодировщик и декодировщик
BИзвлечение признаков (свёртки+пулинг) и классификатор (полносвязные слои)
CВход и выход
DРазмытие и резкость
2. Что выучивают ранние слои CNN по сравнению с поздними?
AРанние — целые объекты, поздние — края
BРанние — простые признаки (края, линии, пятна), поздние — сложные (части и целые объекты)
CВсе слои выучивают одно и то же
DРанние слои не обучаются
3. Зачем в конце классификационной CNN применяют softmax?
AЧтобы размыть картинку
BЧтобы превратить сырые отклики (логиты) в вероятности классов, суммирующиеся в единицу
CЧтобы уменьшить разрешение
DЧтобы выделить границы
Поддержать проект