- •Предисловие
- •Благодарности
- •О книге
- •Кому адресована эта книга
- •О примерах кода
- •Об авторе
- •От издательства
- •1.1 Искусственный интеллект, машинное и глубокое обучение
- •1.1.1. Искусственный интеллект
- •1.1.2. Машинное обучение
- •1.1.3. Изучение правил и представлений данных
- •1.1.4. «Глубина» глубокого обучения
- •1.1.5. Принцип действия глубокого обучения в трех картинках
- •1.1.6. Какой ступени развития достигло глубокое обучение
- •1.1.7. Не верьте рекламе
- •1.1.8. Перспективы ИИ
- •1.2. Что было до глубокого обучения: краткая история машинного обучения
- •1.2.1. Вероятностное моделирование
- •1.2.2. Первые нейронные сети
- •1.2.3. Ядерные методы
- •1.2.4. Деревья решений, случайные леса и градиентный бустинг
- •1.2.5. Назад к нейронным сетям
- •1.2.6. Отличительные черты глубокого обучения
- •1.2.7. Современный ландшафт машинного обучения
- •1.3. Почему глубокое обучение? Почему сейчас?
- •1.3.1. Оборудование
- •1.3.2. Данные
- •1.3.3. Алгоритмы
- •1.3.4. Новая волна инвестиций
- •1.3.5. Демократизация глубокого обучения
- •1.3.6. Ждать ли продолжения этой тенденции?
- •2.1. Первое знакомство с нейронной сетью
- •2.2. Представление данных для нейронных сетей
- •2.2.1. Скаляры (тензоры нулевого ранга)
- •2.2.2. Векторы (тензоры первого ранга)
- •2.2.3. Матрицы (тензоры второго ранга)
- •2.2.4. Тензоры третьего и более высоких рангов
- •2.2.5. Ключевые атрибуты
- •2.2.6. Манипулирование тензорами с помощью NumPy
- •2.2.7. Пакеты данных
- •2.2.8. Практические примеры тензоров с данными
- •2.2.9. Векторные данные
- •2.2.10. Временные ряды или последовательности
- •2.2.11. Изображения
- •2.2.12. Видео
- •2.3. Шестеренки нейронных сетей: операции с тензорами
- •2.3.1. Поэлементные операции
- •2.3.2. Расширение
- •2.3.3. Скалярное произведение тензоров
- •2.3.4. Изменение формы тензора
- •2.3.5. Геометрическая интерпретация операций с тензорами
- •2.3.6. Геометрическая интерпретация глубокого обучения
- •2.4. Механизм нейронных сетей: оптимизация на основе градиента
- •2.4.2. Производная операций с тензорами: градиент
- •2.4.3. Стохастический градиентный спуск
- •2.4.4. Объединение производных: алгоритм обратного распространения ошибки
- •2.5. Оглядываясь на первый пример
- •2.5.1. Повторная реализация первого примера в TensorFlow
- •2.5.2. Выполнение одного этапа обучения
- •2.5.3. Полный цикл обучения
- •2.5.4. Оценка модели
- •Краткие итоги главы
- •3.1. Что такое TensorFlow
- •3.2. Что такое Keras
- •3.3. Keras и TensorFlow: краткая история
- •3.4. Настройка окружения для глубокого обучения
- •3.4.1. Jupyter Notebook: предпочтительный способ проведения экспериментов с глубоким обучением
- •3.4.2. Использование Colaboratory
- •3.5. Первые шаги с TensorFlow
- •3.5.1. Тензоры-константы и тензоры-переменные
- •3.5.2. Операции с тензорами: математические действия в TensorFlow
- •3.5.3. Второй взгляд на GradientTape
- •3.5.4. Полный пример: линейный классификатор на TensorFlow
- •3.6. Анатомия нейронной сети: знакомство с основами Keras
- •3.6.1. Слои: строительные блоки глубокого обучения
- •3.6.2. От слоев к моделям
- •3.6.3. Этап «компиляции»: настройка процесса обучения
- •3.6.4. Выбор функции потерь
- •3.6.5. Метод fit()
- •3.6.6. Оценка потерь и метрик на проверочных данных
- •3.6.7. Вывод: использование модели после обучения
- •Краткие итоги главы
- •4.1. Классификация отзывов к фильмам: пример бинарной классификации
- •4.1.1. Набор данных IMDB
- •4.1.2. Подготовка данных
- •4.1.3. Конструирование модели
- •4.1.4. Проверка решения
- •4.1.5. Использование обученной сети для предсказаний на новых данных
- •4.1.6. Дальнейшие эксперименты
- •4.1.7. Подведение итогов
- •4.2.1. Набор данных Reuters
- •4.2.2. Подготовка данных
- •4.2.3. Конструирование модели
- •4.2.4. Проверка решения
- •4.2.5. Предсказания на новых данных
- •4.2.6. Другой способ обработки меток и потерь
- •4.2.7. Важность использования достаточно больших промежуточных слоев
- •4.2.8. Дальнейшие эксперименты
- •4.2.9. Подведение итогов
- •4.3. Предсказание цен на дома: пример регрессии
- •4.3.1. Набор данных с ценами на жилье в Бостоне
- •4.3.2. Подготовка данных
- •4.3.3. Конструирование модели
- •4.3.5. Предсказания на новых данных
- •4.3.6. Подведение итогов
- •Краткие итоги главы
- •5.1. Обобщение: цель машинного обучения
- •5.1.1. Недообучение и переобучение
- •5.1.2. Природа общности в глубоком обучении
- •5.2. Оценка моделей машинного обучения
- •5.2.1. Обучающие, проверочные и контрольные наборы данных
- •5.2.2. Выбор базового уровня
- •5.2.3. Что важно помнить об оценке моделей
- •5.3. Улучшение качества обучения модели
- •5.3.1. Настройка основных параметров градиентного спуска
- •5.3.2. Использование более удачной архитектуры
- •5.3.3. Увеличение емкости модели
- •5.4. Улучшение общности
- •5.4.1. Курирование набора данных
- •5.4.2. Конструирование признаков
- •5.4.3. Ранняя остановка
- •5.4.4. Регуляризация модели
- •Краткие итоги главы
- •6.1. Определение задачи
- •6.1.1. Формулировка задачи
- •6.1.2. Сбор данных
- •6.1.3. Первичный анализ данных
- •6.1.4. Выбор меры успеха
- •6.2. Разработка модели
- •6.2.1. Подготовка данных
- •6.2.2. Выбор протокола оценки
- •6.2.3. Преодоление базового случая
- •6.2.4. Следующий шаг: разработка модели с переобучением
- •6.2.5 Регуляризация и настройка модели
- •6.3. Развертывание модели
- •6.3.1. Объяснение особенностей работы модели заинтересованным сторонам и обозначение границ ожидаемого
- •6.3.2. Предоставление доступа к модели
- •6.3.3. Мониторинг качества работы модели в процессе эксплуатации
- •6.3.4. Обслуживание модели
- •Краткие итоги главы
- •7.1. Спектр рабочих процессов
- •7.2. Разные способы создания моделей Keras
- •7.2.1. Последовательная модель Sequential
- •7.2.2. Функциональный API
- •7.2.3. Создание производных от класса Model
- •7.2.4 Смешивание и согласование различных компонентов
- •7.2.5. Используйте правильный инструмент
- •7.3. Встроенные циклы обучения и оценки
- •7.3.1. Использование собственных метрик
- •7.3.2. Использование обратных вызовов
- •7.3.3. Разработка своего обратного вызова
- •7.3.4. Мониторинг и визуализация с помощью TensorBoard
- •7.4. Разработка своего цикла обучения и оценки
- •7.4.1. Обучение и прогнозирование
- •7.4.2. Низкоуровневое использование метрик
- •7.4.3. Полный цикл обучения и оценки
- •7.4.4. Ускорение вычислений с помощью tf.function
- •7.4.5. Использование fit() с нестандартным циклом обучения
- •Краткие итоги главы
- •8.1. Введение в сверточные нейронные сети
- •8.1.1. Операция свертывания
- •8.1.2. Выбор максимального значения из соседних (max-pooling)
- •8.2. Обучение сверточной нейронной сети с нуля на небольшом наборе данных
- •8.2.1. Целесообразность глубокого обучения для решения задач с небольшими наборами данных
- •8.2.2. Загрузка данных
- •8.2.3. Конструирование сети
- •8.2.4. Предварительная обработка данных
- •8.2.5. Обогащение данных
- •8.3. Использование предварительно обученной модели
- •8.3.1. Выделение признаков
- •8.3.2. Дообучение предварительно обученной модели
- •Краткие итоги главы
- •9.2. Пример сегментации изображения
- •9.3. Современные архитектурные шаблоны сверточных сетей
- •9.3.1. Модульность, иерархия, многократное использование
- •9.3.2. Остаточные связи
- •9.3.3. Пакетная нормализация
- •9.3.4. Раздельная свертка по глубине
- •9.3.5. Собираем все вместе: мини-модель с архитектурой Xception
- •9.4. Интерпретация знаний, заключенных в сверточной нейронной сети
- •9.4.1. Визуализация промежуточных активаций
- •9.4.2. Визуализация фильтров сверточных нейронных сетей
- •9.4.3. Визуализация тепловых карт активации класса
- •Краткие итоги главы
- •Глава 10. Глубокое обучение на временных последовательностях
- •10.1. Разные виды временных последовательностей
- •10.2. Пример прогнозирования температуры
- •10.2.1. Подготовка данных
- •10.2.2. Базовое решение без привлечения машинного обучения
- •10.2.4. Попытка использовать одномерную сверточную модель
- •10.2.5. Первое базовое рекуррентное решение
- •10.3. Рекуррентные нейронные сети
- •10.3.1. Рекуррентный слой в Keras
- •10.4. Улучшенные методы использования рекуррентных нейронных сетей
- •10.4.1. Использование рекуррентного прореживания для борьбы с переобучением
- •10.4.2. Наложение нескольких рекуррентных слоев друг на друга
- •10.4.3. Использование двунаправленных рекуррентных нейронных сетей
- •10.4.4. Что дальше
- •Краткие итоги главы
- •Глава 11. Глубокое обучение для текста
- •11.1. Обработка естественных языков
- •11.2. Подготовка текстовых данных
- •11.2.1. Стандартизация текста
- •11.2.2. Деление текста на единицы (токенизация)
- •11.2.3. Индексирование словаря
- •11.2.4. Использование слоя TextVectorization
- •11.3. Два подхода к представлению групп слов: множества и последовательности
- •11.3.1. Подготовка данных IMDB с отзывами к фильмам
- •11.3.2. Обработка наборов данных: мешки слов
- •11.3.3. Обработка слов как последовательностей: модели последовательностей
- •11.4. Архитектура Transformer
- •11.4.1. Идея внутреннего внимания
- •11.4.2. Многоголовое внимание
- •11.4.3. Кодировщик Transformer
- •11.4.4. Когда использовать модели последовательностей вместо моделей мешка слов
- •11.5. За границами классификации текста: обучение «последовательность в последовательность»
- •11.5.1. Пример машинного перевода
- •11.5.2. Обучение типа «последовательность в последовательность» рекуррентной сети
- •Краткие итоги главы
- •Глава 12. Генеративное глубокое обучение
- •12.1. Генерирование текста
- •12.1.1. Краткая история генеративного глубокого обучения для генерирования последовательностей
- •12.1.3. Важность стратегии выбора
- •12.1.4. Реализация генерации текста в Keras
- •12.1.5. Обратный вызов для генерации текста с разными значениями температуры
- •12.1.6. Подведение итогов
- •12.2. DeepDream
- •12.2.1. Реализация DeepDream в Keras
- •12.2.2. Подведение итогов
- •12.3. Нейронная передача стиля
- •12.3.1. Функция потерь содержимого
- •12.3.2. Функция потерь стиля
- •12.3.3. Нейронная передача стиля в Keras
- •12.3.4. Подведение итогов
- •12.4. Генерирование изображений с вариационными автокодировщиками
- •12.4.1. Выбор шаблонов из скрытых пространств изображений
- •12.4.2. Концептуальные векторы для редактирования изображений
- •12.4.3. Вариационные автокодировщики
- •12.4.4. Реализация VAE в Keras
- •12.4.5. Подведение итогов
- •12.5. Введение в генеративно-состязательные сети
- •12.5.1. Реализация простейшей генеративно-состязательной сети
- •12.5.2. Набор хитростей
- •12.5.3. Получение набора данных CelebA
- •12.5.4. Дискриминатор
- •12.5.5. Генератор
- •12.5.6. Состязательная сеть
- •12.5.7. Подведение итогов
- •Краткие итоги главы
- •Глава 13. Методы и приемы для применения на практике
- •13.1. Получение максимальной отдачи от моделей
- •13.1.1. Оптимизация гиперпараметров
- •13.1.2. Ансамблирование моделей
- •13.2. Масштабирование обучения моделей
- •13.2.1. Ускорение обучения на GPU со смешанной точностью
- •13.2.2. Обучение на нескольких GPU
- •13.2.3. Обучение на TPU
- •Краткие итоги главы
- •Глава 14. Заключение
- •14.1. Краткий обзор ключевых понятий
- •14.1.1. Разные подходы к ИИ
- •14.1.2. Что делает глубокое обучение особенным среди других подходов к машинному обучению
- •14.1.3. Как правильно воспринимать глубокое обучение
- •14.1.4. Ключевые технологии
- •14.1.5. Обобщенный процесс машинного обучения
- •14.1.6. Основные архитектуры сетей
- •14.1.7. Пространство возможностей
- •14.2. Ограничения глубокого обучения
- •14.2.1. Риск очеловечивания моделей глубокого обучения
- •14.2.2 Автоматы и носители интеллекта
- •14.2.3. Локальное и экстремальное обобщение
- •14.2.4. Назначение интеллекта
- •14.2.5. Восхождение по спектру обобщения
- •14.3. Курс на увеличение универсальности в ИИ
- •14.3.2 Новая цель
- •14.4. Реализация интеллекта: недостающие ингредиенты
- •14.4.1. Интеллект как чувствительность к абстрактным аналогиям
- •14.4.2. Два полюса абстракции
- •14.4.3. Недостающая половина картины
- •14.5. Будущее глубокого обучения
- •14.5.1. Модели как программы
- •14.5.2. Сочетание глубокого обучения и синтеза программ
- •14.5.3. Непрерывное обучение и повторное использование модульных подпрограмм
- •14.5.4. Долгосрочная перспектива
- •14.6. Как не отстать от прогресса в быстроразвивающейся области
- •14.6.1. Практические решения реальных задач на сайте Kaggle
- •14.6.2. Знакомство с последними разработками на сайте arXiv
- •14.6.3. Исследование экосистемы Keras
- •Заключительное слово
8.1. Введение в сверточные нейронные сети 261
сети.—.стали.показывать.удивительно.хорошие.результаты.в.состязаниях.по. классификации.изображений..Сначала.Дэн.Киресан.победил.в.двух.специализированных.соревнованиях.(ICDAR.2011,.соревнования.по.распознаванию.китайских.символов,.и.IJCNN.2011,.соревнования.по.распознаванию.дорожных.знаков. Германии)..Затем.произошло.еще.более.значимое.событие:.осенью.2012.года. группа.Хинтона.выиграла.крупномасштабное.состязание.по.визуальному.распознаванию.изображений.из.набора.ImageNet..После.этого.начали.появляться. многообещающие.результаты.в.других.задачах.компьютерного.зрения.
Интересно.отметить,.что.первых.успехов.было.недостаточно,.чтобы.сделать. глубокое.обучение.популярным,.—.на.это.потребовалось.несколько.лет..Сообще- ство.исследователей.технологий.компьютерного.зрения.потратило.много.лет. на.разработку.методов,.не.связанных.с.нейронными.сетями,.и.не.было.готово.
в.одночасье.отказаться.от.них,.только.потому.что.на.пороге.появилось.что-то. новое..В.2013.и.2014.годах.многие.ученые.в.области.компьютерного.зрения.все. еще.встречали.идею.глубокого.обучения.с.большим.скептицизмом.—.и.только.
в.2016.году.она.наконец.заняла.доминирующие.позиции..Помню,.как.в.феврале. 2014.года.я.убеждал.своего.бывшего.профессора.заняться.глубоким.обучени- ем..«У.этой.технологии.большое.будущее»,.—.говорил.я..«А.мне.кажется,.это. временное.поветрие»,.—.парировал.он..Но.уже.в.2016.году.вся.его.лаборатория. занималась.глубоким.обучением..Ничто.не.остановит.идею,.время.которой. пришло.
Данная.глава.знакомит.со.сверточными.нейронными.сетями.(также.известными. как.convnets).—.разновидностью.моделей.глубокого.обучения,.почти.повсеместно. используемой.в.приложениях.компьютерного.зрения.(распознавания.образов).. Здесь.вы.научитесь.применять.сверточные.нейронные.сети.для.решения.задач. классификации.изображений,.в.частности.задач.с.небольшими.наборами.обучающих.данных,.которые.являются.наиболее.распространенными.(если.только. вы.не.работаете.в.крупной.технологической.компании).
8.1. ВВЕДЕНИЕ В СВЕРТОЧНЫЕ НЕЙРОННЫЕ СЕТИ
В.этом.разделе.мы.погрузимся.в.теорию.сверточных.нейронных.сетей.и.выясним. причины.их.успеха.в.задачах.распознавания.образов..Но.сначала.рассмотрим. практический.пример.простой.сверточной.нейронной.сети,.классифициру ющей.изображения.рукописных.цифр.из.набора.MNIST..Эту.задачу.мы.решили. в.главе.2,.использовав.полносвязную.сеть.(ее.точность.на.контрольных.данных. составила.97,8.%)..Несмотря.на.простоту.сверточной.нейронной.сети,.ее.точность. будет.значительно.выше.полносвязной.модели.из.главы.2.
В.следующем.листинге.показано,.как.выглядит.простая.сверточная.нейронная. сеть..Это.стек.слоев.Conv2D .и.MaxPooling2D..Как.она.действует,.рассказывается. чуть.ниже..Мы.построим.модель.с.помощью.функционального.API,.с.которым. вы.познакомились.в.предыдущей.главе.
262 Глава 8. Введение в глубокое обучение в технологиях зрения
Листинг 8.1. Создание небольшой сверточной нейронной сети
from tensorflow import keras
from tensorflow.keras import layers inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs) x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x) x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x) x = layers.Flatten()(x)
outputs = layers.Dense(10, activation="softmax")(x) model = keras.Model(inputs=inputs, outputs=outputs)
Важно.отметить,.что.данная.сеть.принимает.на.входе.тензоры.с.формой.(высота_ изображения,.ширина_изображения,.каналы),.не.включая.измерение,.определяющее. пакеты..В.данном.случае.мы.настроили.сеть.на.обработку.входов.с.размерами. (28, .28, .1),.соответствующими.формату.изображений.в.наборе.MNIST.
Рассмотрим.поближе.текущую.архитектуру.сети.
Листинг 8.2. Сводная информация о сети
>>> model.summary() Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
_________________________________________________________________
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 3, 3, 128) 73856
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 10) 11530
=================================================================
Total params: 104,202 Trainable params: 104,202 Non-trainable params: 0
_________________________________________________________________
Как.видите,.все.слои.Conv2D.и.MaxPooling2D.выводят.трехмерный.тензор.с.формой. (высота,.ширина,.каналы)..Измерения.ширины.и.высоты.сжимаются.с.ростом.
8.1. Введение в сверточные нейронные сети 263
глубины.сети..Количество.каналов.управляется.первым.аргументом,.передаваемым.в.слои.Conv2D .(32,.64.или.128).
Последний.слой.Conv2D .выдает.результат.с.формой.(3, 3, 128).—.карту.призна- ков.3.×.3.со.128.каналами..Следующий.шаг.—.передача.этого.результата.на.вход. полносвязной.классифицирующей.сети,.подобной.той,.с.которой.мы.уже.знакомы:. стека.слоев.Dense..Эти.классификаторы.обрабатывают.векторы.—.одномерные. массивы,.—.тогда.как.текущий.выход.является.трехмерным.тензором..Чтобы.пре- одолеть.это.несоответствие,.мы.преобразуем.трехмерный.вывод.в.одномерный. с.помощью.слоя.Flatten,.а.затем.добавляем.полносвязные.слои.Dense.
В.заключение.выполняется.классификация.по.десяти.категориям,.поэтому.последний.слой.имеет.десять.выходов.и.активацию.softmax.
Теперь.обучим.сверточную.сеть.распознаванию.цифр.MNIST..Мы.будем.повторно.брать.большое.количество.программного.кода.из.главы.2..Поскольку. модель.выполняет.классификацию.по.десяти.категориям.с.активацией.softmax,. мы.используем.функцию.потерь.категориальной.перекрестной.энтропии,.а.так. как.метки.являются.целыми.числами,.нам.понадобится.разреженная.версия. sparse_categorical_crossentropy.
Листинг 8.3. Обучение сверточной нейронной сети на данных из набора MNIST
(train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype("float32") / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype("float32") / 255 model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
Оценим.модель.на.контрольных.данных.
Листинг 8.4. Оценка сверточной сети
>>>test_loss, test_acc = model.evaluate(test_images, test_labels)
>>>print(f"Test accuracy: {test_acc:.3f}")
Test accuracy: 0.991
Полносвязная.сеть.из.главы.2.показала.точность.97,8.%.на.контрольных.данных,. а.простенькая.сверточная.нейронная.сеть.—.99,3.%:.мы.уменьшили.процент. ошибок.на.68.%.(относительно)..Неплохо!
Но.почему.такая.простая.сверточная.нейронная.сеть.работает.намного.лучше. полносвязной.модели?.Чтобы.ответить.на.этот.вопрос,.погрузимся.в.особенности.работы.слоев.Conv2D .и.MaxPooling2D.
264 Глава 8. Введение в глубокое обучение в технологиях зрения
8.1.1. Операция свертывания
Основное.отличие.полносвязного.слоя.от.сверточного.заключается.в.следующем:.слои.Dense.изучают.глобальные.шаблоны.в.пространстве.входных.признаков. (например,.в.случае.с.цифрами.из.набора.MNIST.это. шаблоны,.вовлекающие.все.пиксели),.тогда.как.сверточные.слои.изучают.локальные.шаблоны.(рис..8.1):. в.случае.с.изображениями.—.шаблоны.в.небольших. двумерных.окнах.во.входных.данных..В.предыдущем. примере.все.такие.окна.имели.размеры.3.×.3.
Эта.ключевая.характеристика.наделяет.сверточные. нейронные.сети.двумя.важными.свойствами:
. шаблоны, которые они изучают, являются инвариантными в отношении переноса..После.изучения.определенного.шаблона.в.правом.нижнем. углу.картинки.сверточная.нейронная.сеть.сможет. распознавать.его.повсюду,.например.в.левом.верх-
нем.углу..Полносвязной.сети.пришлось.бы.изучить.шаблон.заново,.появись.он. в.другом.месте..Это.увеличивает.эффективность.сверточных.сетей.в.задачах. обработки.изображений.(потому.что.видимый мир по своей сути является инвариантным в отношении переноса):.таким.сетям.требуется.меньше.обучающих.образцов.для.получения.представлений,.обладающих.силой.обобщения;
.они могут изучать пространственные иерархии шаблонов. .Первый.сверточный.слой.будет.изучать.небольшие.локальные.шаблоны,.такие.как.края,. второй.—.более.крупные.шаблоны,.состоящие.из.признаков,.возвращаемых. первым.слоем,.и.т..д..(рис..8.2)..Это.позволяет.сверточным.нейронным.сетям. эффективно.изучать.все.более.сложные.и.абстрактные.визуальные.представления.(потому.что.видимый мир по своей сути является пространственноиерархическим).
Свертка.применяется.к.трехмерным.тензорам,.называемым.картами признаков,.с.двумя.пространственными.осями.(высотой.и.шириной),.а.также.с.осью глубины.(или.осью каналов)..Для.изображений.в.формате.RGB.размерность.оси. глубины.равна.3,.потому.что.имеется.три.канала.цвета:.красный.(red),.зеленый. (green).и.синий.(blue)..Для.черно-белых.изображений,.как.в.наборе.MNIST,. ось.глубины.имеет.размерность.1.(оттенки.серого)..Операция.свертывания. извлекает.шаблоны.из.своей.входной.карты.признаков.и.применяет.одинаковые.преобразования.ко.всем.шаблонам,.производя.выходную карту признаков.. Выходная.карта.признаков.также.является.трехмерным.тензором:.у.нее.есть. ширина.и.высота..Ее.глубина.может.иметь.любую.размерность,.потому.что. выходная.глубина.является.параметром.слоя,.и.разные.каналы.на.этой.оси.
8.1. Введение в сверточные нейронные сети 265
глубины.больше.не.соответствуют.конкретным.цветам,.как.во.входных.данных. в.формате.RGB;.скорее,.они.соответствуют.фильтрам..Фильтры.представляют. конкретные.аспекты.входных.данных:.на.верхнем.уровне,.например,.фильтр. может.соответствовать.понятию.«присутствие.лица.на.входе».
Рис. 8.2. Видимый мир формируется пространственными иерархиями видимых модулей: элементарные линии или текстуры объединяются в простые объекты, такие как глаза или уши, которые, в свою очередь, объединяются в понятия еще более высокого уровня, такие как «кошка»
В.примере.MNIST.первый.сверточный.слой.принимает.карту.признаков.размером.(28, .28, .1) .и.выводит.карту.признаков.размером.(26, .26, .32):.он.вычисляет.32.фильтра.по.входным.данным..Каждый.из.этих.32.выходных.каналов. содержит.сетку.26.×.26.значений.—.карту ответов.фильтра.на.входных.данных,. определяющую.ответ.этого.шаблона.фильтра.для.разных.участков.входных. данных.(рис..8.3).
Вот.что.означает.термин.«карта признаков»:.каждое.измерение.на.оси.глубины.—. это.признак.(или.фильтр),.а.двумерный.тензор.output[:, .:, .n] .—.это.двумерная. пространственная.карта.ответов.фильтра.на.входных.данных.
Свертки.определяются.двумя.ключевыми.параметрами:
.размером шаблонов, извлекаемых из входных данных, .—.обычно.3.×.3.или.5.×.5..
В.данном.примере.используется.размер.3.×.3,.что.является.распространенным.выбором;
266 Глава 8. Введение в глубокое обучение в технологиях зрения
.глубиной выходной карты признаков.—.количеством.фильтров,.вычисляемых. сверткой..В.данном.примере.свертка.начинается.с.глубины.32.и.заканчивается.глубиной.64.
Рис. 8.3. Понятие карты ответов: двумерная карта присутствия шаблона на разных участках входных данных
В .Keras .эти .параметры .передаются .в .слои .Conv2D .в .первых .аргументах:.
Conv2D(выходная_глубина,.(высота_окна,.ширина_окна)).
Свертка .работает .методом .скользящего .окна: .она .двигает .окно .размером. 3 .×.3 .или .5 .×.5 .по .трехмерной .входной .карте .признаков, .останавливается. в.каждой.возможной.позиции.и.извлекает.трехмерный.шаблон.окружающих. признаков.(с.формой.(высота_окна,.ширина_окна,.глубина_входа))..Каждый. такой.трехмерный.шаблон.затем.преобразуется.(путем.умножения.тензора. на.матрицу.весов,.получаемую.в.ходе.обучения,.которая.называется.ядром свертки).в.одномерный.вектор.с.формой.(выходная.глубина,)..Все.эти.векторы. затем.собираются.в.трехмерную.выходную.карту.с.формой.(высота,.ширина,. выходная.глубина)..Каждое.пространственное.местоположение.в.выходной. карте.признаков.соответствует.тому.же.местоположению.во.входной.карте. признаков.(например,.правый.нижний.угол.выхода.содержит.информацию. о.правом.нижнем.угле.входа)..Например,.для.окна.3.×.3.вектор.output[i, .j, .:] . соответствует .трехмерному.шаблону .input[i-1:i+2, .j-1:j+2, .:]..Полный. процесс.изображен.на.рис..8.4.
Обратите.внимание,.что.выходные.ширина.и.высота.могут.отличаться.от.входных..На.то.есть.две.причины:
.эффекты.границ,.которые.могут.устраняться.дополнением.входной.карты. признаков;
. использование.шага свертки,.определение.которого.приводится.чуть.ниже.
Рассмотрим.подробнее.эти.понятия.
8.1. Введение в сверточные нейронные сети 267
Рис. 8.4. Принцип действия свертки
Эффекты границ и дополнение
Перед.нами.карта.признаков.5.×.5.(всего.25.клеток)..Существует.всего.девять. клеток,.в.которых.может.находиться.центр.окна.3.×.3,.образующих.сетку.3.×.3. (рис..8.5)..Следовательно,.карта.выходных.признаков.будет.иметь.размер.3.×.3..
Она.получилась.немного.сжатой:.ровно.на.две.клетки.вдоль.каждого.измерения.. Вы.можете.увидеть,.как.проявляется.эффект.границ.на.более.раннем.примере:. изначально.у.нас.имелось.28.×.28.входов,.количество.которых.после.первого. сверточного.слоя.сократилось.до.26.×.26.
Чтобы.получить.выходную.карту.признаков.с.теми.же.пространственными. размерами,.что.и.входная.карта,.можно.использовать.дополнение .(padding)..
Дополнение.заключается.в.добавлении.соответствующего.количества.строк. и.столбцов.с.каждой.стороны.входной.карты.признаков,.чтобы.можно.было. поместить.центр.окна.свертки.в.каждую.входную.клетку..Для.окна.3.×.3.нужно. добавить.один.столбец.справа,.один.столбец.слева,.одну.строку.сверху.и.одну. строку.снизу..Для.окна.5.×.5.нужно.добавить.две.строки.(рис..8.6).
268 Глава 8. Введение в глубокое обучение в технологиях зрения
Рис. 8.5. Допустимые местоположения шаблонов 3 ×3 во входной карте признаков 5 ×5
Рис. 8.6. Дополнение входной карты признаков 5 ×5, чтобы получить 25 шаблонов 3 ×3
При.использовании.слоев.Conv2D.дополнение.настраивается.с.помощью.аргумента.padding,.который.принимает.два.значения:."valid",.означающее.отсутствие. дополнения.(будут.использоваться.только.допустимые.местоположения.окна),. и."same",.означающее.«дополнить.так,.чтобы.выходная.карта.признаков.имела. те.же.ширину.и.высоту,.что.и.входная»..По.умолчанию.аргумент.padding .получает.значение."valid".
Шаг свертки
Другой.фактор,.который.может.влиять.на.размер.выходной.карты.признаков,.—. шаг свертки..До.сих.пор.в.объяснениях.выше.предполагалось,.что.центральная. клетка.окна.свертки.последовательно.перемещается.в.смежные.клетки.входной. карты..Однако.в.общем.случае.расстояние.между.двумя.соседними.окнами.