Построение двухуровневой нейронной сети для двоичных классификаций

1. Введение

Когда я занят семестровыми экзаменами или домашними делами, меня всегда тянет к орбите видео с кошками. И, что особенно важно, счастье, вызванное кошками, совершающими глупые поступки своими очаровательными лапками, перевешивает вину за промедление. Я подумал про себя, почему бы не объединить два моих величайших интереса - кошки и машинное обучение - во благо технического прогресса. Следовательно, импровизированная классификация изображений Cat с помощью двухуровневой нейронной сети (по сути, это модель логистической регрессии).

В этом руководстве основное внимание уделяется разработке простого алгоритма логистической регрессии с мышлением нейронной сети, чтобы отличать изображения кошек от изображений, не являющихся изображениями кошек.

Эта статья касается просто абстрактной концепции учебника; для более глубокого изучения кода, пожалуйста, обратитесь к репозиторию Github здесь. В репозитории также есть глубокая нейронная сеть L-уровня, которая превосходит двухуровневую модель.

2. Данные

2.1 Сводка данных

Учитывая набор данных, содержащий:

  • Обучающий набор изображений m_train, помеченных как кошка (y = 1) или не кошка (y = 0).
  • Тестовый набор изображений m_test, помеченных как кошка (y = 1) или не кошка (y = 0).
  • Каждое изображение имеет форму (num_px, num_px, 3), где 3 для 3 каналов компонентов RGB. Таким образом, каждое изображение является квадратом (height = num_px) и (width = num_px).

2.2 Изменение формы данных

Для удобства мы должны преобразовать формы изображений (num_px, num_px, 3) в массив numpy форм (num_px ∗ num_px ∗ 3, 1). После этого наш набор данных для обучения и тестирования будет преобразован в массив numpy, где каждый столбец представляет собой сплющенное изображение. Должны быть столбцы m_train и, соответственно, m_test.

2.2 Предварительная обработка данных

Для представления цветных изображений необходимо указать красный, зеленый и синий каналы (RGB) для каждого пикселя; следовательно, значение каждого пикселя на самом деле является вектором из трех чисел в диапазоне от 0 до 255.

Одним из распространенных шагов предварительной обработки в машинном обучении является центрирование и стандартизация вашего набора данных, что означает, что мы вычитаем среднее значение всего массива numpy из каждого примера, а затем делим каждый пример на стандартное отклонение всего массива numpy. Хотя для наборов данных изображений проще и удобнее просто разделить каждую строку набора данных на 255 (максимальное значение пиксельного канала).

3. Общая архитектура алгоритма обучения.

Сглаженные входные матрицы будут переданы через параметры взвешенных матриц, W [i], и векторы смещения, b [i]. Затем значение Yhat будет предсказано путем передачи параметров через сигмовидную функцию активации. Используя значения параметров и соответствующие им значения Yhat ,, мы можем минимизировать затраты, вычислив функцию стоимости; затем изучите параметры для моделирования.

4. Построение алгоритма

Основные этапы построения нейронной сети:

  1. Определите структуру модели (например, количество входных функций)
  2. Инициализировать параметры модели
  3. Петля:
  • Рассчитать текущие потери (прямое распространение)
  • Рассчитать текущий градиент (обратное распространение)
  • Обновить параметры с помощью градиентного спуска

Мы часто реализуем функции / шаги 1–3 отдельно, а затем объединяем их в одну функцию, которую мы называем model().

4.1 Вспомогательные функции

Сначала мы реализуем сигмовидную функцию, используя математическое выражение:

4.2 Инициализация параметров

Мы должны инициализировать W и b как векторы из нулей.

Примечание. Обычно в более глубоких нейронных сетях (с большим количеством слоев и нейронов) мы обычно инициализируем вектор W случайным образом. Это потому, что каждый нейрон в первом скрытом слое будет выполнять одни и те же вычисления. Таким образом, даже после нескольких итераций градиентного спуска каждый нейрон в слое будет вычислять то же самое, что и другие нейроны. Обратитесь к репозиторию Github для получения дополнительной информации.

4.3 Прямое и обратное распространение

Теперь, когда наши параметры инициализированы, мы можем инициировать шаги «вперед» и «назад» для изучения параметров.

4.4 Оптимизация

Теперь, когда мы инициализировали наши параметры и вычислили функцию стоимости и ее градиент, мы перейдем к обновлению наших параметров с помощью градиентного спуска.

Цель состоит в том, чтобы изучить параметры w и b, минимизируя функцию стоимости J. Для параметра θ правило обновления - θ = θ − αdθ, где α - скорость обучения.

4.5 Прогноз Йхат

Предыдущая функция выведет изученные w и b; следовательно, , w e могут использовать w и b для прогнозирования меток для набора данных X путем реализации функции predict(). Расчет прогнозов состоит из двух этапов:

  1. Вычислить Ŷ = A = σ (w.T * X + b)
  2. Преобразуйте записи a в 0 (если активация ‹= 0,5) или 1 (если активация› 0,5); хранить прогнозы в векторе Y_prediction.

4.6 Основные выводы

Функции, реализованные выше:

  • Инициализировать (w, b).
  • Оптимизируйте потери итеративно, чтобы узнать параметры (w, b).
  • Вычислите стоимость и ее градиент.
  • обновление параметров с помощью градиентного спуска.
  • Используйте изученные (w, b), чтобы предсказать метки для заданного набора примеров.

5. Моделирование

Теперь мы увидим, как структурирована общая модель, собрав вместе все строительные блоки (функции, реализованные в предыдущих частях) в правильном порядке.

Точность обучения близка к 100%. Это хорошая проверка работоспособности: наша модель работает и имеет достаточно высокую емкость, чтобы соответствовать обучающим данным. С другой стороны, точность теста составляет 70%. На самом деле это неплохо для этой простой модели, учитывая небольшой набор данных, который мы использовали, и то, что логистическая регрессия является линейным классификатором.

Интерпретация: вы можете увидеть снижение стоимости. Это показывает, что параметры изучаются. Однако вы видите, что вы можете еще больше обучить модель на обучающей выборке. Попробуйте увеличить количество итераций в ячейке выше и перезапустите ячейки. Вы можете увидеть, что точность обучающего набора повышается, но точность набора тестов снижается. Это называется переобучением.

6. Дальнейший анализ

6.1 Выбор скорости обучения

Чтобы градиентный спуск работал, вы должны с умом выбирать скорость обучения. Скорость обучения α определяет, насколько быстро мы обновляем параметры. Если скорость обучения слишком велика, мы можем «превысить» оптимальное значение. Точно так же, если он слишком мал, нам понадобится огромное количество итераций, чтобы прийти к лучшим значениям. Вот почему так важно использовать хорошо настроенную скорость обучения.

Давайте сравним кривую обучения нашей модели с несколькими вариантами скорости обучения. Не стесняйтесь также попробовать другие значения, отличные от трех, которые мы инициализировали для переменной learning_rates, и посмотреть, что произойдет.

Интерпретация:

  • Разные скорости обучения приводят к разным затратам и, следовательно, к разным результатам прогнозов.
  • Если скорость обучения слишком велика (0,01), стоимость может колебаться вверх и вниз. Он может даже расходиться (хотя в этом примере использование 0,01 все равно в конечном итоге дает хорошее соотношение цены и качества).
  • Более низкая стоимость не означает лучшую модель. Вы должны проверить, нет ли переобучения; это случается, когда точность обучения намного выше, чем точность теста.

В глубоком обучении обычно рекомендуется выбирать скорость обучения, которая наилучшим образом минимизирует функцию затрат. Если ваша модель переоснащается, используйте другие методы для уменьшения переобучения, например настройку гиперпараметров.

6.2 Анализ результатов

Давайте посмотрим на некоторые изображения, на которых модель обозначена неправильно. Это покажет несколько изображений с неправильной маркировкой.

Вот несколько типов изображений, с которыми модель плохо справляется:

  • Тело кошки в необычной позе
  • Кошка появляется на фоне похожего цвета
  • Необычный окрас и вид кошки
  • Угол камеры
  • Яркость картинки
  • Изменение масштаба (кошка на изображении очень большая или маленькая)

7. Протестируйте свой образ в репозитории Github!

Вот образец изображения котенка, который я нашел на Unsplash и решил протестировать на модели:

Угадайте, что было на выходе модели:

Ура! Хотя это было получено из простой модели логистической регрессии, тем не менее это было полезно: кошки - всегда победа. Загляните в репозиторий Github, чтобы подробно изучить классификацию изображений кошек с использованием двухуровневой нейронной сети и глубокой нейронной сети L-уровня.

использованная литература

Особая благодарность deeplearning.ai!

[1] Репозиторий Github для двухуровневой и L-уровневой глубокой классификации нейронных сетей: https://github.com/TheClub4/Cat_Classification

[2] для автоматической перезагрузки внешнего модуля: http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython