Примечание редактора: эта статья представляет собой задачу Kaggle — решение классификации семян растений, автор Кумар Шридхар, наконец, занял пятое место. Методы в нем очень общие и могут использоваться для других задач распознавания изображений.
Обзор задач
Можете ли вы отличить сорняки от проростков сельскохозяйственных культур?
Если можно эффективно выявлять сорняки, можно эффективно улучшить производство продуктов питания и лучше управлять окружающей средой. Обработка сигналов Орхусского университета и Университет Южной Дании совместно выпустили набор данных о 12 видах растений, в общей сложности около 960 растений на разных стадиях роста.
Одно из образцов растений
Набор данных теперь общедоступен, а изображения RGB аннотированы с физическим разрешением примерно 10 пикселей на миллиметр. Ниже приведен пример выборки из 12 растений в наборе данных:
Чтобы классифицировать каждое изображение по отдельной категории, задачу можно разбить на 5 шагов:
первый шаг
Во-первых, самой важной задачей в машинном обучении является анализ набора данных, и очень важно понимать сложность набора данных, прежде чем приступать к разработке алгоритма.
Распределение различных типов изображений в наборе данных выглядит следующим образом:
Как упоминалось ранее, здесь всего 12 видов растений и 4750 фотографий. Однако из приведенного выше изображения видно, что классификация различных растений неравномерна, у одних видов 654 изображения, а у других всего 221. Это полностью показывает, что данные несбалансированы, что мы рассмотрим на третьем шаге.
Распределение типов изображений
Теперь визуализируйте картинку, чтобы лучше понять данные. На картинке ниже выбрано 12 растений каждого типа, и они сравниваются, чтобы увидеть, чем они отличаются.
Различные растения на картинке очень похожи, и нет ничего особенного в том, чтобы просто смотреть на картинку. Поэтому я решил использовать технику визуализации t-SNE для классификации изображений.
t-SNE — это метод уменьшения размерности, подходящий для многомерных наборов данных, и его можно применять к большим наборам данных реального мира с помощью метода Барнса-Хата. На Zhijun также сообщается соответствующая информация:
t-SNE визуализация набора данных
Присмотревшись, трудно увидеть разницу между категориями. Поэтому важно выяснить, являются ли данные просто неразличимыми для человека или модели машинного обучения. Поэтому нам нужно разработать базовый стандарт для этого.
набор для обучения и проверки
Прежде чем мы начнем закладывать основу для модели, нам нужно разделить данные на обучающий набор и проверочный набор. Как правило, модели сначала обучаются на обучающем наборе, затем тестируются на проверочном наборе и со временем улучшают производительность на проверочном наборе. Когда мы получим удовлетворительные результаты на проверочном наборе, мы можем применить модель к реальному тестовому набору, чтобы увидеть, является ли модель подходящей или недостаточной, а затем внести коррективы.
Мы используем 80% из 4750 изображений в наборе данных в качестве набора для обучения и 20% в качестве набора для проверки.
второй шаг
Имея наборы для обучения и проверки, мы начинаем тестировать набор данных. В этой задаче мы будем использовать архитектуру сверточной нейронной сети. Если вы новичок, рекомендуется сначала прочитать статьи об основах глубокого обучения:Вводные заметки по глубокому обучению.
Есть много способов создать модель CNN, мы выбрали библиотеку глубокого обучения Keras. Обучение CNN с нуля очень неэффективно, поэтому мы выбрали вес модели, предварительно обученный в ImageNet, настроили его и затем обучили. Верхний слой используется для изучения простых базовых функций, поэтому его можно применять напрямую без обучения. Важно отметить, что мы хотим проверить сходство между нашим набором данных и ImageNet и насколько велик наш набор данных. Эти две характеристики будут определять, как мы должны приспосабливаться. Подробнее читайте в статье Андрея Карпати: cs231n.github.io/transfer-learning/
В этой задаче наш набор данных меньше, но похож на ImageNet. Таким образом, мы можем сначала использовать веса ImageNet напрямую, а затем добавить выходной слой с 12 видами растений в конце, чтобы получить первый тест. После этого разблокируем следующие слои и тренируемся.
Мы используем Keras для построения начального бенчмарка, потому что Keras может предоставить некоторые предварительно обученные модели, среди них мы выбираем ResNet50 и InceptionResNetV2.
Опять же, мы можем выбрать базовые модели на основе эффективности обнаружения этих моделей в наборе данных ImageNet и количества параметров каждой модели.
Для первого теста я удалил последний выходной слой и добавил выходной слой с 12 видами. В частности, следующим образом:
Модель проходит 10 итераций, а результат насыщается после 6-й. Точность обучения достигла 88%, а точность проверки — 87%.
Для дальнейшего повышения производительности некоторые нижние уровни не заблокированы, где скорость обучения падает экспоненциально. Это привело к повышению производительности на два процентных пункта.
В этом процессе используются следующие гиперпараметры:
третий шаг
Когда у нас есть основные критерии, нам нужно улучшить модель на их основе. Мы можем начать с добавления большего количества данных, тем самым увеличив количество изображений в наборе данных. В конце концов, данные — это основа машинного обучения.
Но мы упоминали ранее, что данные несбалансированы, и нам нужно с этим справиться.
Реальные наборы данных никогда не сбалансированы, а модели не очень хорошо работают на небольших классах. Таким образом, ошибочная классификация данных в классе меньшинства как обычно обходится дороже, чем обычная ошибка классификации.
Итак, чтобы сбалансировать данные, обычно есть два метода:
1.Алгоритм АДАСИН.ADASYN может синтезировать данные для типов с меньшим количеством выборок.Его основная идея заключается в взвешенном распределении различных типов с небольшим количеством выборок в соответствии со степенью сложности обучения.Чем сложнее синтезируются типы, тем легче типы изучать.Меньше данных. Таким образом, метод ADASYN улучшает эффективность обучения двумя способами, изменяя распределение данных: (1) уменьшая систематическую ошибку, вызванную дисбалансом классификации, и (2) адаптивно перемещая границу решения о классификации в сторону сложных выборок.
2. Алгоритм SMOTE.Алгоритм SMOTE заключается в передискретизации или понижении выборки нескольких классов для получения наилучших результатов. За счет передискретизации класса меньшинства и понижения частоты дискретизации класса большинства классификатор может получить наилучшую производительность.
В этом случае SMOTE работает лучше, чем ADASYN. После того, как набор данных сбалансирован, мы можем выполнить обработку увеличения данных, используя следующие методы:
-
Трансформация масштаба
-
обрезать
-
кувырок
-
вращать
-
Сковорода
-
добавлять шум
-
изменить условия освещения
-
GAN
четвертый шаг
Чтобы еще больше повысить производительность, мы хотим улучшить скорость обучения. Перед этим нам сначала нужно выяснить, какова оптимальная скорость обучения для модели. Это требует построения графика между скоростью обучения и функцией потерь, чтобы увидеть, где потери начинают уменьшаться.
В нашем случае 1e-1 выглядит как идеальная скорость обучения, но по мере приближения к глобальному минимуму мы хотим делать меньшие шаги. Одним из методов является отжиг скорости обучения, но я использую теплый перезапуск. Опять же, оптимизатор был переключен с Adam на SGD и установлен SGDR.
Теперь мы обучаем несколько архитектур с помощью описанных выше методов, а затем объединяем результаты вместе, что называется ансамблем моделей. Хотя этот метод очень распространен, он требует больших вычислительных ресурсов. Поэтому я решил использовать ансамбль снимков, который заключается в обучении одной нейронной сети ансамблю и позволяет ей сходиться к нескольким локальным минимумам во время оптимизации, сохраняя параметры модели.
После того, как я избавился от метода скорости обучения, я начал изменять размер изображений. Я обучил модель с размером изображения 64x64 (тонкая настройка на ImageNet), после разблокировки некоторых слоев применил рекуррентную скорость обучения и ансамбль снимков, взял веса модели, изменил размер на 299x299, а затем на основе Fine-tuning на весах 64×64 с последующей интеграцией снапшотов и горячим перезапуском.
пятый шаг
Последним шагом является визуализация результатов, чтобы определить, какой класс имеет лучшую (или худшую) производительность, и есть другие настройки, которые необходимо внести для улучшения результатов. Хороший способ понять результаты — построить матрицу путаницы.
Мы можем видеть разницу между метками, предсказанными моделью, и истинными метками, и мы можем постепенно улучшать эту ситуацию. Мы также можем увеличить количество данных, чтобы модель научилась большему разнообразию.
После того, как предложение было представлено, я занял первое место (но в настоящее время занимает пятое место, поскольку конкуренция развернулась).
Исходный адрес: medium.com/neuralspace/kaggle-1-winning-approach-for-image-classification-challenge-9c1188157a86.