В продолжение Части-1 я предлагаю вам больше концепций глубокого обучения в консолидированной форме. Пожалуйста, проверьте Введение и эта статья для вас? в первой части.

Скорость обучения и планировщик

Алгоритм оптимизации сообщает когда обновлять параметры модели. Скорость обучения показывает, сколько необходимо обновить параметры модели. Цель алгоритма оптимизации — снизить потери модели или достичь точки минимума (зеленая метка на первом изображении). Скорость обучения определяет, насколько маленькие или большие обновления будут выполняться для параметров модели во время обратного распространения, чтобы достичь минимального значения или точки.

Если вам трудно понять некоторые термины, проверьте Часть 1, где они четко объяснены.

Скорость обучения — это гиперпараметр, который означает, что вам придется обновлять параметр самостоятельно, и модель не будет обновлять (или изучать) его во время обучения, и его значение в основном находится в диапазоне от 0,0 до 1,0.

Планировщик скорости обучения. Один из вариантов — полностью запустить модель, дождаться результатов и затем самостоятельно настроить скорость обучения. Другой вариант — определить пользовательскую функцию, которая позволяет Keras обрабатывать процесс обновления. Второй вариант называется LR Scheduler. Keras предоставляет класс LearningRateScheduler, который позволяет нам определить пользовательскую функцию, а затем автоматически применять ее в процессе обучения для расчета LR. Эта функция должна принимать номер эпохи в качестве аргумента, а затем вычислять желаемую скорость обучения на основе функции, которую мы определяем.

Стандартные шаги в задаче глубокого обучения

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

  1. Подготовьте набор глобальных переменных для каждого гиперпараметра. Переменные помогают вам изменять значения прямо в верхней части записной книжки, не погружаясь и не ища их в длинном коде.
  2. Загрузите данные обучения и проверки и примените дополнение данных. Выполните разделение на данные обучения, если у вас нет отдельных данных проверки.
  3. Подготовьте архитектуру модели. Каждый уровень имеет функцию активации, которую вы должны определить. В начале слоя Fully Connected (FC) или Dense вы должны один раз сгладить ввод. Окончательный слой FC или Dense должен иметь результат, равный количеству классов, которое вы прогнозируете.
  4. Скомпилируйте свою модель. Этот шаг включает в себя определение функции потерь и алгоритма оптимизации.
  5. Определите функции обратного вызова, которые ваша модель будет вызывать в нужное время. Настоятельно рекомендуется использовать Traning Monitor и EpochCheckpoint.
  6. Обучите свою модель. Это сердце всего пайплайна и самая трудоемкая часть. Ресурс GPU на самом деле нужен только для этого шага.
  7. Постройте кривые. После завершения процесса обучения у вас есть модель, проверка графика и кривые потерь.
  8. Оцените модель. Если кривые выглядят хорошо, проведите тестирование на тестовом наборе данных, а затем на реальных изображениях. Найдите матрицу путаницы для модели. Что вы хотите делать со своей обученной моделью, полностью зависит от вас?
  9. Настройте гиперпараметры, если это необходимо. Если модель не оправдала ожиданий, внесите небольшие изменения в гиперпараметры.

Вы можете проверить мой пример блокнота для справки о том, как каждый шаг фактически выполняется в коде.

Недообучение и переоснащение

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

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

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

Лучший способ определить недообучение и переоснащение — использовать кривые точности и потерь. Я настоятельно рекомендую проверить эту статью (не от меня) для отличного объяснения. Это определенно поможет вам в принятии решений об улучшении производительности вашей модели.

Средства от переобучения (методы регуляризации)

  1. Упростите архитектуру модели. Модели склонны «схватывать» входные данные, если они слишком сложны по сравнению с изображениями, которые они должны изучать. Попробуйте уменьшить количество слоев или нейронов в каждом слое, хотя нет конкретного способа определить, сколько нужно удалить.
  2. Используйте дополнение данных. Попробуйте предоставить модели различные данные.
  3. Регуляризация L1 и L2: эти методы добавляют дополнительный «штраф» к нашим исходным функциям потерь. В сетях DL, которые работают с изображениями, вы в основном будете использовать регуляризацию L2.
  4. Пакетная нормализация. Как видите, переобучение во многом связано с входными данными. Если бы вместо изменения архитектуры модели мы могли бы внести некоторые изменения во входные данные, это снова помогло бы предотвратить переоснащение. Мы добавляем в нашу модель новый слой пакетной нормализации, который выполняет операции стандартизации и нормализации на входных данных слоя, поступающих из предыдущего слоя. Доказано, что BN чрезвычайно эффективен для сокращения количества эпох, необходимых для обучения нейронной сети.
    Пакетная нормализация работает по каналам, поэтому нам нужно указать, по какой оси выполнять нормализацию.
    ось =-1 подразумевает последний порядок каналов[строки][столбцы][каналы].
    axis=1 подразумевает первый порядок каналов[каналы][строки][столбцы].
  5. Dropouts: при создании архитектуры модели мы добавляем промежуточные слои Dropout. Выпадающие слои случайным образом отключают входные данные от предыдущего слоя к следующему слою. Dropout гарантирует, что нейроны следующего слоя не будут полностью зависеть от нейронов предыдущего слоя (чтобы они ничего не «схватывали»). Даже если некоторые нейроны в предыдущих слоях отключены, нейроны в следующем слое должны функционировать. Процент отсева p указывает, что p% нейронов в этом слое будут отключаться случайным образом во время обучения.

«Идеальная» кривая

Все изображения взяты отсюда.

Некоторые общие термины

  1. Точность ранга 1 и ранга 5. Точность ранга 1 — это процент прогноза, при котором верхний прогноз соответствует метке истинности. Из 10 классов, которые должна была предсказать модель, ваша модель предсказала, что на изображении изображена собака, а наземная метка этого изображения также была собакой. Это стандартный тип точности, о котором вы сообщаете.
    Точность Rank5, с другой стороны, немного снижается в модели и принимает 5 лучших прогнозов, сделанных моделью. Допустим, в том же предыдущем примере модель предсказала изображение собаки как кошки, но если мы увидим первые 5 предсказаний, сделанных моделью, то там также было предсказание собаки, поэтому этот случай не будет учитываться в точности ранга 1, но по-прежнему засчитывается в точность ранга 5.
  2. Импульс. Помните это изображение из обсуждения скорости обучения. цель состоит в том, чтобы достичь подножия холма или склона. Импульс добавляет немного «силы» к нашей скорости обучения, чтобы мы могли достичь минимума немного раньше. Скорость можно было бы изменить, изменив скорость обучения. Тогда зачем нам импульс? Потому что это умно по сравнению со скоростью обучения. Импульс увеличивает силу обновлений (настроек) для параметров/весов модели, градиенты которых указывают в одном направлении, и уменьшает силу обновлений для параметров/весов, градиенты которых меняют направление.

3. Ускорение Нестерова: допустим, вы создали импульс и двигаетесь к точке минимума с огромной скоростью, вам каким-то образом придется уменьшить скорость, поскольку вы собираетесь достичь минимума (цели). . Ускорение Нестерова действует как корректирующий параметр для обновления импульса и дает модели приблизительное представление о том, что модель вот-вот достигнет цели, поэтому соответствующим образом измените свой импульс.

Трансферное обучение

Модель глубокого обучения требует большого количества входных данных для обучения с нуля. Размер и качество набора данных являются важными параметрами для успешной модели. Нет смысла обучать модель с нуля, если у вас нет достаточного количества данных. Вот где на сцену выходит трансферное обучение. В трансферном обучении мы используем некоторые существующие обученные модели в качестве отправной точки для нашей собственной модели. Используя Transfer Learning, вы можете обучить новую модель классифицировать метки классов за пределами того, на чем она была изначально обучена. (Все ссылки и изображения в этом разделе взяты из PyImagesearch, это так хорошо объяснено, что мне не хочется писать свои собственные слова).

Существует два основных способа трансферного обучения:

  1. Извлечение признаков:обрабатывая сеть как средство извлечения признаков, мы, по сути, «отсекаем» сеть в произвольной точке (обычно перед полностью связанными слоями). Затем мы передаем наш пользовательский набор данных в эту нарезанную сеть и получаем функции, которые генерирует новая нарезанная сеть. Затем эти функции передаются какому-нибудь простому классификатору, такому как (логистическая регрессия), где и происходит фактическая работа по определению меток.
    Сама исходная CNN не несет ответственности за распознавание этих новых классов, вместо этого мы используем CNN в качестве промежуточной функции. экстрактор. Нижестоящий классификатор машинного обучения позаботится об изучении базовых моделей функций, извлеченных из CNN.

Вот как это делается в коде:

model = VGG16(weights="imagenet", include_top=False)

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

1. Возьмите модель или архитектуру (например, ResNet или VGGNet) и отрежьте ее окончательный набор полносвязных (FC) слоев (т. е. «голову» сети).
2. Замените голову новым набором полносвязных (FC) слоев со случайными инициализациями.
3. Заморозить все слои ниже головы, чтобы их веса нельзя было обновить (т. е. обратный проход обратного распространения не достигал их).
4. Разрешить новые слои чтобы разогреться. Это достигается за счет обучения сети с использованием очень малой скорости обучения, поэтому новый набор слоев FC может начать изучать шаблоны из ранее изученных слоев CONV ранее в сети.

Вот как выглядит пример кода для этих шагов:

#chop off the head
baseModel = VGG16(weights="imagenet", include_top=False, 62 input_tensor = Input(shape=(224, 224, 3)))
#create new head
headModel = FCHeadNet.build(baseModel, len(classNames), 256)
#replace chopped off head with new head
model = Model(inputs=baseModel.input, outputs=headModel)

#Freeze layers
for layer in baseModel.layers:
    layer.trainable = False

Когда использовать трансферное обучение и какой метод использовать?

Доктор Адриан Роузброк из PyImagesearch предлагает отличный способ определить, когда использовать модель трансферного обучения или обучения с нуля. Я представлю это в виде таблицы.

Заключительные слова

На данный момент мне кажется, что я рассмотрел большинство фундаментальных концепций глубокого обучения. Ваше путешествие не должно ограничиваться этими статьями и концепциями. DL — это огромный мир, который требует от вас постоянных усилий и обучения. Мне действительно потребовалось много усилий, чтобы составить эти статьи, поэтому, пожалуйста, поделитесь ими в своей сети. Если у меня будет больше времени, я обязательно придумаю следующие части этой серии. Еще раз большое спасибо доктору Адриану Роузброку из PyImagesearch и Джейсону Браунли из MLMastery, я рекомендую всем ознакомиться с их статьями и методами кодирования, которые не только помогут вам понять основы DL, но и проложат вам путь к практическому техники ДЛ.

Ссылка на часть 1 этой статьи.