- •Предисловие
- •Благодарности
- •О книге
- •Кому адресована эта книга
- •О примерах кода
- •Об авторе
- •От издательства
- •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
- •Заключительное слово
54 Глава 1. Что такое глубокое обучение
1.3.5. Демократизация глубокого обучения
Одним.из.ключевых.факторов,.обусловивших.приток.новых.лиц.в.глубокое.обучение,.стала.демократизация.инструментов,.используемых.в.данной.области..
На.начальном.этапе.глубокое.обучение.требовало.значительных.знаний.и.опыта. программирования.на.C++.и.владения.CUDA,.чем.могли.похвастаться.очень. немногие..В.настоящее.время.для.исследований.в.области.глубокого.обучения. достаточно.базовых.навыков.программирования.на.Python..Это.вызвано.прежде. всего.развитием.Theano.и.позднее.TensorFlow.(двух.фреймворков.для.Python,. реализующих.операции.с.тензорами,.которые.поддерживают.автоматическое. дифференцирование.и.значительно.упрощают.реализацию.новых.моделей),. а.также.появлением.дружественных.библиотек.(например,.Keras),.которые.делают. работу.с.глубоким.обучением.таким.же.простым.делом,.как.манипулирование. кубиками.лего..После.выхода.в.2015.году.библиотека.Keras.быстро.была.принята. за.основу.многими.командами.новых.стартапов,.аспирантами.и.исследователями,. работающими.в.этой.области.
1.3.6. Ждать ли продолжения этой тенденции?
Есть.ли.что-то.особенное.в.глубоком.обучении,.что.делает.его.правильным. выбором.и.для.компаний-инвесторов,.и.для.исследователей?.Или.это.просто. увлечение,.которое.не.продлится.долго?.Будем.ли.мы.использовать.глубокие. нейронные.сети.через.20.лет?
Глубокое.обучение.имеет.несколько.свойств,.которые.подтверждают.и.укрепляют.его.статус.«революции.в.ИИ»..Возможно,.нейронные.сети.исчезнут.через. два.десятилетия,.но.все,.что.останется.после.них,.будет.прямым.наследником. современного.глубокого.обучения.и.его.основных.идей..Эти.важнейшие.идеи. можно.разделить.на.три.категории:
.простота.—.глубокое.обучение.избавляет.от.необходимости.конструировать. признаки,.заменяя.сложные,.противоречивые.и.тяжелые.конвейеры.простыми.обучаемыми.моделями,.которые.обычно.строятся.с.использованием. 5–6.тензорных.операций;
.масштабируемость .—.глубокое.обучение.легко.поддается.распараллели- ванию.на.GPU.или.TPU,.поэтому.оно.в.полной.мере.может.использовать. закон.Мура..Кроме.того,.обучение.моделей.можно.производить.итеративно, .на .небольших .пакетах .данных, .что .дает .возможность .осуществлять. этот.процесс.на.наборах.данных.произвольного.размера.(единственным. узким .местом .является .объем .доступной .мощности .для .параллельных. вычислений,.которая,.как.следует.из.закона.Мура,.является.быстро.перемещающимся.барьером);
1.3. Почему глубокое обучение? Почему сейчас? 55
.гибкость и готовность к многократному использованию.—.в.отличие.от.многих. предшествовавших.подходов.модели.глубокого.обучения.могут.совершенствоваться.на.дополнительных.данных.без.полного.перезапуска,.что.делает. их.пригодными.для.непрерывного.и.продолжительного.обучения.—.это. чрезвычайно.важно.для.очень.больших.промышленных.моделей..Кроме.того,. подобные.модели.можно.перенацеливать.и,.соответственно,.задействовать. многократно:.например,.модель,.обученную.классификации.изображений,. можно.включить.в.конвейер.обработки.видео..Это.позволяет.использовать. предыдущие.наработки.для.создания.все.более.сложных.и.мощных.моделей..
Это.также.позволяет.применить.глубокое.обучение.к.очень.маленьким.объемам.данных.
Глубокое.обучение.находится.в.центре.внимания.всего.несколько.лет,.и.мы.еще. не.определили.границы.его.возможностей..Каждый.месяц.мы.узнаем.о.новых. и.новых.вариантах.использования.и.инженерных.усовершенствованиях,.которые. снимают.предыдущие.ограничения..После.научной.революции.прогресс.обычно. развивается.по.сигмоиде:.сначала.наблюдается.быстрый.рост,.который.постепенно.стабилизируется,.когда.исследователи.сталкиваются.с.труднопреодолимыми. ограничениями,.и.затем.дальнейшие.усовершенствования.замедляются.
В.2016.году,.когда.шла.работа.над.первым.изданием.этой.книги,.я.утверждал,. что.глубокое.обучение.все.еще.находится.в.первой.половине.сигмоиды.и.в.следующие.несколько.лет.ожидается.гораздо.больший.прогресс.в.преобразованиях.. Это.подтвердилось.на.практике:.в.2017.и.2018.годах.наблюдался.рост.популярности.моделей.глубокого.обучения.на.основе.Transformer,.используемых.для. обработки.естественного.языка.и.совершивших.революцию.в.данной.области..
В.то.же.время.глубокое.обучение.продолжало.обеспечивать.устойчивый.прогресс. в.области.распознавания.образов.и.речи..В.2021.году.оно,.похоже,.перешло.во. вторую.половину.сигмоиды..Все.еще.можно.ожидать.значительного.развития. в.предстоящие.годы,.но,.скорее.всего,.мы.уже.вышли.из.начальной.фазы.стремительного.прогресса.
Я.чрезвычайно.рад,.что.технологии.глубокого.обучения.находят.применение. во.все.более.широком.круге.задач.—.на.самом.деле.их.потенциальный.список. бесконечен..Глубокое.обучение.—.это.все.еще.революция,.и.потребуется.много. лет,.чтобы.полностью.реализовать.его.потенциал.
Математические2основы нейронных сетей
В этой главе
33 Первый пример нейронной сети.
33 Тензоры и операции с тензорами.
33 Процесс обучения нейронной сети методами обратного распространения ошибки и градиентного спуска.
Для.понимания.глубокого.обучения.необходимо.знать.множество.простых. математических.понятий:.тензоры,.операции с тензорами,.дифференцирование,.
градиентный спуск.и.т..д..Наша.цель.в.данной.главе.—.познакомиться.с.этими. понятиями,.не.погружаясь.слишком.глубоко.в.теорию..В.частности,.мы.будем. избегать.математических.формул,.которые.не.всегда.нужны.для.достаточно. полного.объяснения.и.могут.оттолкнуть.читателей,.не.имеющих.математической.подготовки..Наиболее.точным.и.однозначным.описанием.математической. операции.является.выполняющий.ее.код.
Чтобы.вам.проще.было.разобраться.с.тензорами.и.градиентным.спуском,.мы. начнем.с.практического.примера.нейронной.сети..А.затем.станем.постепенно. знакомиться.с.новыми.понятиями..Имейте.в.виду,.что.знание.этих.понятий. потребуется.вам.для.понимания.практических.примеров.в.следующих.главах!
Прочитав.эту.главу,.вы.освоите.математическую.теорию,.на.которой.основывается.глубокое.обучение,.и.будете.готовы.погрузиться.в.изучение.Keras. и.TensorFlow.в.главе.3.
2.1.Первое знакомство с нейронной сетью 57
2.1.ПЕРВОЕ ЗНАКОМСТВО
С НЕЙРОННОЙ СЕТЬЮ
Рассмотрим.конкретный.пример.нейронной.сети,.которая.обучается.классификации.рукописных.цифр.и.создана.с.помощью.библиотеки.Keras.для.Python.. Если.у.вас.нет.опыта.использования.Keras.или.других.подобных.библиотек,. возможно,.вы.не.все.здесь.поймете..Но.пусть.вас.это.не.пугает..В.следующей. главе.мы.рассмотрим.и.подробно.объясним.каждый.элемент.в.примере..Поэто- му.не.волнуйтесь,.если.какие-то.шаги.покажутся.странными.или.похожими.на. магию..В.конце.концов,.мы.должны.с.чего-то.начать.
Перед.нами.стоит.задача:.реализовать.классификацию.черно-белых.изображений. рукописных.цифр.(28.×.28.пикселей).по.десяти.категориям.(от.0.до.9)..Мы.будем. использовать.набор.данных.MNIST,.популярный.в.сообществе.исследователей. глубокого.обучения,.который.существует.практически.столько.же,.сколько.сама. область.машинного.обучения,.и.широко.используется.для.обучения..Этот.набор. содержит.60.000.обучающих.изображений.и.10.000.контрольных.изображений,. собранных.Национальным.институтом.стандартов.и.технологий.США.(National. Institute.of.Standards.and.Technology.—.часть.NIST.в.аббревиатуре.MNIST). в.1980-х.годах..«Решение».задачи.MNIST.можно.рассматривать.как.своеобразный. аналог.Hello.World.в.глубоком.обучении.—.часто.это.первое.действие,.которое. выполняется.для.уверенности,.что.алгоритмы.действуют.в.точности.как.ожи-
далось..По.мере.углубления.в.практику. |
|
машинного.обучения.вы.увидите,.что. |
|
MNIST.часто.упоминается.в.научных. |
|
статьях, .блогах .и .т..д..Некоторые .об- |
|
разцы.изображений.из.набора.MNIST. |
Рис. 2.1. Образцы изображений MNIST |
можно.видеть.на.рис..2.1. |
ПРИМЕЧАНИЕ
В.машинном.обучении.категория .в.задаче.классификации.называется.классом.. Элементы.исходных.данных.именуются.образцами..Класс,.связанный.с.конкретным. образцом,.называется.меткой.
Не.пытайтесь.сразу.же.воспроизвести.пример.на.своем.компьютере..Чтобы.его. опробовать,.нужно.сначала.установить.библиотеку.Keras.—.а.это.будет.рассмо- трено.в.главе.3.
Набор.данных.MNIST.уже.входит.в.состав.Keras.в.форме.набора.из.четырех. массивов.NumPy.
Листинг 2.1. Загрузка набора данных MNIST в Keras
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
58 Глава 2. Математические основы нейронных сетей
Здесь.train_images .и.train_labels .—.это.обучающий набор,.то.есть.данные,.на. которых.модель.обучается..После.обучения.модель.будет.проверяться.тестовым. (или.контрольным).набором,.test_images .и.test_labels.
Изображения.хранятся.в.массивах.NumPy,.а.метки.—.в.массиве.цифр.от.0.до.9.. Изображения.и.метки.находятся.в.прямом.соответствии,.один.к.одному.
Рассмотрим.обучающие.данные:
>>>train_images.shape (60000, 28, 28)
>>>len(train_labels) 60000
>>>train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
И.контрольные.данные:
>>>test_images.shape (10000, 28, 28)
>>>len(test_labels) 10000
>>>test_labels
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
Вот.как.мы.будем.действовать.дальше:.сначала.передадим.нейронной.сети.обучающие.данные,.train_images .и.train_labels..Сеть.обучится.подбирать.правильные.метки.для.изображений..А.затем.мы.предложим.ей.классифицировать. изображения.в.test_images .и.проверим.точность.классификации.по.меткам. из.test_labels.
Теперь.сконструируем.сеть..Не.забывайте.—.от.вас.никто.не.ждет,.что.вы.поймете. в.этом.примере.все.и.сразу.
Листинг 2.2. Архитектура сети
from tensorflow import keras
from tensorflow.keras import layers model = keras.Sequential([
layers.Dense(512, activation="relu"), layers.Dense(10, activation="softmax")
])
Основным.строительным.блоком.нейронных.сетей.является.слой..Слой.можно. рассматривать.как.фильтр.для.данных:.он.принимает.их.и.выводит.в.некоторой. более.полезной.форме..В.частности,.слои.извлекают.представления.из.входных. данных,.которые,.как.мы.надеемся,.будут.иметь.больше.смысла.для.решаемой. задачи..Фактически.методика.глубокого.обучения.заключается.в.объединении. простых.слоев,.реализующих.некоторую.форму.поэтапной.очистки данных..
2.1. Первое знакомство с нейронной сетью 59
Модель.глубокого.обучения.можно.сравнить.с.ситом,.состоящим.из.последова- тельности.фильтров.—.слоев.—.все.более.тонкой.работы.с.данными.
В.нашем.случае.сеть.состоит.из.последовательности.двух.слоев.Dense,.которые. являются.тесно.связанными.(их.еще.называют.полносвязными).нейронными. слоями..Второй.(и.последний).слой.—.это.десятипеременный.слой.классифика- ции softmax,.возвращающий.массив.с.десятью.оценками.вероятностей.(в.сумме. дающих.1)..Каждая.оценка.определяет.вероятность.принадлежности.текущего. изображения.к.одному.из.десяти.классов.цифр.
Чтобы.подготовить.модель.к.обучению,.нужно.настроить.еще.три.параметра. для.этапа.компиляции:
.оптимизатор.—.механизм,.с.помощью.которого.сеть.будет.обновлять.себя,. опираясь.на.наблюдаемые.данные.и.функцию.потерь;
.функцию потерь.—.определяет,.как.сеть.должна.оценивать.качество.своей. работы.на.обучающих.данных.и,.соответственно,.корректировать.ее.в.правильном.направлении;
.метрики для мониторинга на этапах обучения и тестирования.—.здесь.нас. будет.интересовать.только.точность.(доля.правильно.классифицированных. изображений).
Назначение.функции.потерь.и.оптимизатора.мы.проясним.в.следующих.двух. главах.
Листинг 2.3. Этап компиляции
model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
Перед.обучением.мы.выполним.предварительную.обработку.данных,.преобразовав.в.форму,.которую.ожидает.получить.нейронная.сеть,.и.масштабируем.их. так,.чтобы.все.значения.оказались.в.интервале.[0,.1]..Исходные.данные.—.обуча ющие.изображения.—.хранятся.в.трехмерном.массиве.(60000,.28,.28).типа.uint8,. значениями.в.котором.являются.числа.в.интервале.[0, .255]..Мы.преобразуем. его.в.массив.(60000, .28 .* .28) .типа.float32 .со.значениями.в.интервале.[0, .1].
Листинг 2.4. Подготовка исходных данных
train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28 * 28)) test_images = test_images.astype('float32') / 255
Теперь.можно.начинать.обучение.сети,.для.чего.в.случае.библиотеки.Keras.до- статочно.вызвать.метод.fit.модели.—.он.попытается.адаптировать.(fit).модель. под.обучающие.данные.
60 Глава 2. Математические основы нейронных сетей
Листинг 2.5. Обучение («адаптация») модели
>>> model.fit(train_images, train_labels, epochs=5, batch_size=128) Epoch 1/5
60000/60000 [==============================] - 9s - loss: 0.2524 - acc: 0.9273 Epoch 2/5
51328/60000 [========================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692
В.процессе.обучения.отображаются.две.величины:.потери.сети.на.обучающих. данных.и.точность.сети.на.обучающих.данных..Мы.быстро.достигли.точности. 0,989.(98,9.%).
Теперь.у.нас.есть.обученная.модель,.которую.можно.использовать.для.прогно- зирования.вероятностей.принадлежности.новых.цифр.к.классам.—.изображений,. которые.не.входили.в.обучающую.выборку,.как.те.из.контрольного.набора.
Листинг 2.6. Использование модели для получения предсказаний
>>>test_digits = test_images[0:10]
>>>predictions = model.predict(test_digits)
>>>predictions[0]
array([1.0726176e-10, 1.6918376e-10, 6.1314843e-08, 8.4106023e-06, 2.9967067e-11, 3.0331331e-09, 8.3651971e-14, 9.9999106e-01, 2.6657624e-08, 3.8127661e-07], dtype=float32)
Каждое.число.в.элементе.массива.с.индексом.i .соответствует.вероятности.принадлежности.изображения.цифры.test_digits[0] .к.классу.i.
Наивысшая.оценка.вероятности.(0,99999106.—.почти.1).для.этого.тестового. изображения.цифры.находится.в.элементе.с.индексом.7,.то.есть.согласно.нашей. модели.—.перед.нами.изображение.цифры.7:
>>>predictions[0].argmax()
7
>>>predictions[0][7]
0.99999106
Прогноз.можно.проверить.по.массиву.меток:
>>> test_labels[0] 7
В.целом,.насколько.хорошо.справляется.наша.модель.с.классификацией.прежде. не.встречавшихся.ей.цифр?.Давайте.проверим,.вычислив.среднюю.точность.по. всему.контрольному.набору.изображений.
Листинг 2.7. Оценка качества модели на новых данных
>>>test_loss, test_acc = model.evaluate(test_images, test_labels)
>>>print(f"test_acc: {test_acc}")
test_acc: 0.9785