Проект сквозного машинного обучения: часть 1

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

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

Часть 1 (этот пост): подготовка данных и обучение модели классификации изображений
Часть 2: развертывание построенной модели с помощью Flask и Docker

В наши дни модели машинного обучения широко используются для создания чат-ботов, голосовых помощников, беспилотных автомобилей и т. д. Одно конкретное достижение было сделано в области распознавания и классификации изображений. Сверточные нейронные сети (CNN), в частности, оказались очень полезными в обучении на основе изображений, что привело к серьезным прорывам в создании современных моделей, таких как Resnet, Alexnet, Inception. »И т. Д., Которые отлично зарекомендовали себя при классификации изображений в наборе данных Imagenet .

В этом посте мы увидим, как обучить модель классификации изображений с нуля, а также использовать предварительно обученные веса из модели Resnet. Этот метод, называемый Transfer Learning,, очень популярен, поскольку он помогает использовать веса, обученные с использованием гораздо большего набора данных и вычислительных ресурсов, применяемых к другому набору данных с минимальными изменениями. Обычно вам просто нужно изменить выходной слой на основе вашего набора данных, и вы можете извлечь выгоду из этих предварительно обученных весов. Целью модели в этом проекте является классификация различных долларовых купюр, и она построена с использованием Tensorflow 2.x и Керас.

Требования

Одна из первых задач заключалась в сборе данных. Не сумев найти подходящие наборы данных для этого проекта, я в конечном итоге сделал фотографии разных долларовых купюр, чтобы создать свой собственный набор данных. Этот окончательный набор данных содержит около 180 изображений, включая несколько негативных изображений, т. Е. Изображений без каких-либо долларовых купюр, так что модель может немного лучше различаться, когда на изображении есть долларовая банкнота.

Я использую Paperspace Gradient для обучения модели, который очень похож на Google Colab и предоставляет бесплатные графические процессоры и среду на основе ноутбука Jupyter для обучения моделей. На мой взгляд, бесплатные графические процессоры здесь немного лучше, чем в Google Colab.

Подготовка и загрузка данных

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

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

Изображения были обработаны и загружены, как показано на изображении 1 ниже.

20% доступных изображений без дополнений было отложено для проверки.

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

Остальные изображения использовались для обучения модели. Ярлыки классов имеют горячее кодирование.

Обучение простой модели CNN

Теперь, когда у меня загружен и дополнен набор данных, следующим шагом будет обучение модели. Я начинаю с создания простой модели CNN с набором из 4 слоев Convolutional + MaxPooling, за которым следует выходной слой с функцией активации softmax.

Я поставил эту модель на тренировку 100 эпох. Я также использовал функцию обратного вызова для Ранняя остановка (дополнительная информация) ,, которая останавливает обучение, когда видит модель не улучшается и начинает переоснащаться. Для этой модели обучения потеря проверки перестает уменьшаться в эпоху 30, а обучение останавливается в эпоху 40 из-за ранней остановки. Лучшая модель - в эпоху 30 сохраняется с помощью другой функции обратного вызова - Контрольная точка модели.

Обучение модели с использованием трансферного обучения

Простая модель CNN не очень хорошо работала на проверочном наборе, поэтому следующим шагом в попытке создать лучшую модель было использование трансферного обучения. Я выбрал Resnet50v2 в качестве базовой модели с весами изображений. Благодаря Keras, который значительно упрощает получение этих весов в одной строке с помощью пакета tf.keras.applications, имеющего список архитектур моделей, таких как resnet, inception и т. Д., С их предварительно натренированные веса.

Важно заморозить (предотвратить обновление веса во время обучения) базовую модель перед ее компиляцией и обучением. Вы можете заморозить один слой модели, установив layer.trainable = False. Модель может иметь много слоев, поэтому установка для обучаемого флага всей модели значения Ложь заморозит все слои.

После замораживания слоев базовой модели Resnet50v2 я добавил слой GlobalAveragePooling, за которым следует слой Dense с активацией softmax, чтобы получить прогнозируемые значения для всех классов.

Обратите внимание на Image-6, что около 23,5 миллионов параметров, соответствующих базовой модели Resnet50v2, заморожены и помечены как необучаемые параметры. Мы только обучаем около 14 тысяч параметров, относящихся к окончательному выходному слою.

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

Обратите внимание на использование category_crossentropy здесь, потому что каждая метка представлена ​​одним горячим вектором. Следует использовать sparse_categorical_crossentropy, если одно значение (индекс класса) представляет каждую метку.

Подобно модели Simple CNN, я установил эту модель для обучения в течение 100 эпох с теми же двумя функциями обратного вызова, но эта модель работала еще хуже. потеря валидации начинает увеличиваться всего через 4 эпохи, что довольно плохо, но это может быть связано с тем, что предварительно обученные веса воображаемой сети для базовой модели не работают напрямую с моим набором данных, и, вероятно, мне придется переобучить некоторые слои базовой модели, чтобы помочь ей изучить особенности, характерные для моего набора данных.

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

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

Точная настройка базовой модели - это процесс переноса обучения, при котором вы тренируете несколько верхних слоев модели, сохраняя веса слоев до их замораживания. Это приведет к тому, что веса будут настроены от сопоставлений общих объектов к объектам, специально связанным с текущим набором данных для этих верхних слоев.

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

Если вы внимательно посмотрите на Изображение-8, вы увидите, что для этой точно настроенной модели существует более 18 миллионов обучаемых параметров по сравнению с примерно 14 тысячами, когда я оставил все веса базовой модели замороженными (см. Изображение -6).

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

Заключение

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

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

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

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

До следующего раза…