Этот пост посвящен подходу, который я использовал для конкурса Kaggle: Классификация саженцев растений. В течение нескольких месяцев я был №1 в рейтинге и, наконец, занял 5-е место по окончательной оценке. Подход довольно общий и может использоваться также для других задач распознавания изображений.

Kaggle - это платформа для соревнований по прогнозному моделированию и аналитике, в которых статистики и специалисты по добыче данных соревнуются за создание лучших моделей для прогнозирования и описания наборов данных, загружаемых компаниями и пользователями. Этот подход краудсорсинга основан на том факте, что существует бесчисленное множество стратегий, которые могут быть применены к любой задаче прогнозного моделирования, и невозможно заранее знать, какая методика или аналитик будут наиболее эффективными [1].

Также ознакомьтесь с блогом, в котором реализованы современные результаты в задаче Классификация намерений по НЛП:



ОБЗОР ЗАДАЧИ

Можете ли вы отличить сорняк от всходов сельскохозяйственных культур?

Способность делать это эффективно может означать более высокие урожаи и более бережное отношение к окружающей среде.

Группа Обработки сигналов Орхусского университета в сотрудничестве с Университетом Южной Дании выпустила набор данных, содержащий изображения примерно 960 уникальных растений, принадлежащих к 12 видам на нескольких стадиях роста [1]. ] [2]

База данных изображений примерно 960 уникальных растений, принадлежащих к 12 видам на разных стадиях роста, стала общедоступной. Он содержит аннотированные изображения RGB с физическим разрешением примерно 10 пикселей на мм.

Для стандартизации оценки результатов классификации, полученных с помощью базы данных, предлагается эталонный тест, основанный на оценках F1. Набор данных доступен по этому URL [13]

На следующем изображении показаны все 12 классов в наборе данных:

Задача классификации изображений по соответствующим классам, задача разбита на 5 шагов:

ШАГ 1:

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

Распределение изображений и классов следующее:

Как уже упоминалось ранее, существует 12 классов и всего 4750 изображений. Однако, как видно из вышеизложенного, распределение неравномерно, и распределение по классам варьируется от максимум 654 изображений до минимум 221 изображения. Это ясно демонстрирует, что данные несбалансированы, и данные должны быть сбалансированы для получения наилучших результатов. Мы подойдем к этому в ШАГЕ 3.

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

Из изображений выше ничего особенного нельзя понять, так как все изображения выглядели примерно одинаково. Итак, я решил увидеть распределение изображений, используя технику визуализации под названием t-распределенное стохастическое соседнее встраивание (t-SNE).

t-Распределенное стохастическое соседнее вложение (t-SNE) - это метод уменьшения размерности, который особенно хорошо подходит для визуализации наборов данных большой размерности. Этот метод может быть реализован с помощью приближений Барнса-Хата, что позволяет применять его к большим реальным наборам данных [14].

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

Набор для обучения и проверки

Перед тем, как начать тестирование модели, нам нужно разделить данные на набор данных для обучения и проверки. Набор проверки играет роль набора тестовых данных перед тестированием модели на исходном наборе тестов. Итак, в основном модель обучается на обучающем наборе данных и тестируется на проверочном наборе, а затем модель со временем может быть улучшена по сравнению с проверочным набором. Когда мы будем удовлетворены результатами набора для проверки, мы можем применить модель к нашему реальному набору тестовых данных. Таким образом, мы можем увидеть, соответствует ли модель нашему набору валидации, что может помочь нам лучше подогнать модель.

Таким образом, мы разделяем наш набор данных из 4750 изображений, сохраняя 80 процентов изображений в качестве набора данных для обучения и 20 процентов в качестве набора для проверки.

ШАГ 2:

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

Если вы новичок и вам нужно лучше понять термины глубокого обучения, посетите блог здесь:



Есть несколько способов создания модели CNN, но для первого теста мы будем использовать библиотеку глубокого обучения Keras. Мы также будем использовать доступные предварительно обученные модели в Keras, обученные на наборе данных ImageNet, и мы точно настроим их для нашей задачи.

Практически неэффективно обучать сверточную нейронную сеть с нуля. Итак, мы берем веса предварительно обученной модели CNN в ImageNet с 1000 классами и тонко настраиваем ее, удерживая некоторые слои замороженными и размораживая некоторые из них и тренируя их. Это связано с тем, что верхние слои изучают простые базовые функции, и нам не нужно обучать эти слои, и это можно напрямую применить к нашей задаче. Следует отметить одну важную вещь: нам нужно проверить, похож ли наш набор данных на ImageNet и насколько велик наш набор данных. Эти 2 функции решат, как мы будем выполнять точную настройку. Чтобы узнать больше, прочитайте блог Андрея Карпати:



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

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

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

Для первого тестирования я удалил последний выходной слой и просто добавил последний выходной слой с 12 классами. Кроме того, была напечатана сводка модели и количество параметров, а ниже - снимки экрана нескольких последних слоев.

Модель была запущена для 10 эпох, когда результаты достигли насыщения после 6 эпох. Достигнутая точность обучения составила 88 процентов и точность проверки 87 процентов.

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

Также в процессе использовались следующие гиперпараметры:

ШАГ 3.

Когда у нас будут готовы базовые тесты, самое время улучшить их. Мы можем начать с увеличения количества данных, чтобы увеличить количество изображений в наборе данных.

Ни данных, ни машинного обучения!

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

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

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

1. Подход адаптивной синтетической выборки для несбалансированного обучения (ADASYN): ADASYN генерирует синтетические данные для классов с меньшим количеством выборок таким образом, что наборы данных, которые труднее изучить, генерируются больше по сравнению с выборками, которые легче учиться.

Основная идея ADASYN состоит в том, чтобы использовать взвешенное распределение для различных примеров классов меньшинств в соответствии с их уровнем сложности в обучении, где больше синтетических данных генерируется для примеров классов меньшинств, которые труднее выучить по сравнению с примерами меньшинств, которые легче усвоить. . В результате подход ADASYN улучшает обучение в отношении распределений данных двумя способами: (1) уменьшая смещение, вызванное дисбалансом классов, и (2) адаптивно смещая границу решения классификации в сторону сложных примеров [5].

2. Техника передискретизации синтетического меньшинства (SMOTE): SMOTE предполагает избыточную выборку класса меньшинства и недостаточную выборку класса большинства для получения наилучших результатов.

Комбинация нашего метода избыточной выборки меньшего (ненормального) класса и недостаточной выборки большинства (нормального) класса может обеспечить лучшую производительность классификатора (в пространстве ROC), чем только недостаточная выборка для большинства класса. [6]

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

Есть несколько способов увеличения данных. Некоторые из наиболее важных из них:

  • Масштабирование
  • Обрезка
  • Листать
  • Вращение
  • Перевод
  • Добавление шума
  • Изменение условий освещения
  • Продвинутые методы, такие как GAN

Уже есть несколько очень хороших блогов, в которых объясняются все эти методы. [8] [9] Поэтому я не буду их подробно объяснять. Были использованы все упомянутые выше методы увеличения данных, кроме GAN.

ШАГ 4:

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

В этой статье описывается новый метод установки скорости обучения, названный циклическими скоростями обучения, который практически устраняет необходимость экспериментального поиска лучших значений и расписания для глобальных скоростей обучения. Вместо того, чтобы монотонно уменьшать скорость обучения, этот метод позволяет скорости обучения циклически варьироваться между разумными граничными значениями. Обучение с циклическими скоростями обучения вместо фиксированных значений позволяет повысить точность классификации без необходимости настройки и часто за меньшее количество итераций. [11]

Так что в нашем случае 1e-1 выглядела как идеальная скорость обучения. Но по мере того, как мы приближаемся к нашим глобальным минимумам, мы хотим делать более короткие шаги. Один из способов сделать это - отжиг скорости обучения, но я использовал скорость обучения с теплыми перезапусками, вдохновленными статьей [10]. Кроме того, оптимизатор был изменен с Adam на SGD и был реализован SGDR.

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

Итак, я решил использовать технику под названием ансамбль снимков [12], которая достигает цели ансамбля путем обучения единственной нейронной сети, схождения ее к нескольким локальным минимумам на пути ее оптимизации и сохранения модели. параметры.

Как только методы скорости обучения были исправлены, я поигрался с размером изображения. Я обучил модель с размером изображения 64 * 64 (точно настроил ее через ImageNet), разморозил некоторые слои, применил циклическую скорость обучения и ансамбль снимков, взял веса модели, изменил размер изображения на 299 * 299 и снова настроил он превышает вес изображения размером 64 * 64 и выполняет ансамбль снимка и скорость обучения с теплыми перезапусками.

Нам нужно снова запустить функцию скорости обучения и потерь, чтобы получить максимальную скорость обучения с течением времени, если мы изменим размер изображения.

ШАГ 5:

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

Один очень хороший способ понять результаты - построить матрицу неточностей.

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

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

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

ПРИМЕЧАНИЕ. Дополнения, используемые при обучении, должны присутствовать в наборе данных тестирования для достижения наилучших возможных результатов.

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

[1] https://www.kaggle.com/c/plant-seedlings-classification

[2] https://arxiv.org/abs/1711.05458

[3] https://vision.eng.au.dk/plant-seedlings-dataset/

[4] https://keras.io/applications/

[5] https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4633969&tag=1

[6] https://jair.org/index.php/jair/article/view/10302

[7] http://contrib.scikit-learn.org/imbalanced-learn/stable/auto_examples/over-sampling/plot_comparison_over_sampling.html#sphx-glr-auto-examples-over-sampling-plot-comparison-over- sampling-py

[8] https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

[9] https://medium.com/ymedialabs-innovation/data-augmentation-techniques-in-cnn-using-tensorflow-371ae43d5be9

[10] https://arxiv.org/pdf/1608.03983.pdf

[11] https://arxiv.org/pdf/1506.01186.pdf

[12] https://arxiv.org/abs/1704.00109

[13] https://vision.eng.au.dk/plant-seedlings-dataset/

[14] https://lvdmaaten.github.io/tsne/

Я хотел бы поблагодарить Джереми Ховарда (fast.ai) за его курс, из которого были взяты многие трюки. Я также хотел бы поблагодарить Mindgarage за предоставление необходимой вычислительной мощности, а также Феликса Лаумана и Пурванши Мехту за их ценные идеи и окончательные редакции.

Не забудьте почитать другие мои блоги здесь