Почему следует использовать классификацию с несколькими метками вместо традиционных методов классификации.

Мотивация

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

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

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

Решение этих проблем можно решить с помощью классификации по нескольким меткам.

Введение в многоуровневую классификацию

Классификация с несколькими метками может использоваться для присвоения одной или нескольких меток каждому входному образцу (изображение, текст, аудио…). Это устраняет недостатки однокомпонентного классификатора следующими способами:

  • Мы можем обучить классификатор с несколькими метками для идентификации изображений, не принадлежащих ни к одной категории, просто имея несколько изображений, не имеющих метки в обучающих данных. Таким образом, классификатор с несколькими метками будет правильно классифицировать любые данные вне домена.
  • Классификация с несколькими метками — это метод, используемый для присвоения более чем одной метки данному входному образцу. Данные могут быть рассказом/фильмом с несколькими жанрами или одним изображением с разными объектами.

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

Исследуйте набор данных

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

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

В загруженном пути мы видим, что у нас есть папки для обучения и тестирования, содержащие изображения, а также файл train.csv, сообщающий нам, какие метки использовать для каждого изображения. Давайте проверим его с помощью pandas,

Во фрейме данных поезда мы видим, что он имеет 3 столбца с filename, labels and is_valid..

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

Подготовка данных

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

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

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

Библиотека fastai автоматически определяет несколько категорий и выполняет однократное кодирование в зависимости от количества доступных целей. (Но когда используется CategoryBlock, выполняется порядковое кодирование категорий, т.е. для классификации по одной метке)

  • get_x: это определяет, как получить входные данные, то есть изображения в нашем случае. В приведенном выше коде мы определили функцию get_x, которая возвращает объект пути к соответствующему имени файла. ImageBlock считывает объект пути, а затем выполняет необходимую обработку, чтобы преобразовать его в объект изображения PIL.
  • get_y:этоопределяет, как получить цели, т. е. несколько категорий для каждого изображения. В приведенной выше функции get_y мы возвращаем список меток, связанных с этим конкретным изображением, полученным путем разделения столбца labels.
  • splitter: это определяет, как мы выполняем разделение нашего набора данных для проверки поезда. В функции разделителя мы используем разбиение фрейма данных на основе столбца «is_valid», а затем возвращаем список всех индексов в качестве обучающих и проверочных наборов.
  • item_tfms: определяет преобразования, которые должны применяться к каждой выборке в наборе данных. Здесь мы используем преобразование RandomResizedCrop, которое случайным образом изменяет размер изображения до размера 128, сохраняя не менее 35% изображения каждый раз, когда применяется преобразование.

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

Теперь, когда у нас есть готовые загрузчики данных, мы можем создать модель.

Обучение модели

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

Функция потерь

Во-первых, давайте обсудим некоторые основы однокомпонентной классификации. В модели бинарной классификации задача состоит в том, чтобы классифицировать любой заданный вход в один из двух классов. Таким образом, потерю можно найти, применив функцию активации sigmoid и пропустив ее через функцию потери BinaryCrossEntropy. Сигмоид отвечает за преобразование всех значений в диапазон [0–1].

Поскольку у нас есть все логиты в диапазоне [0–1], мы можем использовать порог 0,5 и определить класс входной выборки.

Точно так же в модели классификации с несколькими метками задача состоит в том, чтобы классифицировать входные данные в один из трех или более классов. Здесь убыток получается, сначала применяя функцию активации softmax, а затем пропуская его через функцию убытка CrossEntropy.

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

Итак, для этой задачи мы используем функцию потерь BinaryCrossEntropy вместе с функцией активации sigmoid. Это связано с тем, что классификация с несколькими метками похожа на двоичную классификацию, за исключением того, что PyTorch применяет активацию и потерю к целевым объектам с горячим кодированием, используя свою поэлементную операцию.

Метрики

Fastai предоставляет метрику accuracy_multi для классификации с несколькими метками. После того, как мы получим выходные логиты из модели, применяется сигмовидная активация для преобразования всех значений в диапазон [0–1]. Затем применяется функция accuracy_multi путем указания порогового значения, т. е. все вероятности выше этого порога будут истинными, иначе они будут ложными. Таким образом, мы получаем предсказания модели.

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

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

Создать учащегося

Давайте создадим объект учащегося, используя модель cnn_learner и resnet50.

Частичная функция принимает функцию и параметр ключевого слова этой функции и возвращает новую функцию с обновленным параметром ключевого слова. В приведенном выше примере мы используем partial для обновления значения thresh метрической функции accuracy_multi по умолчанию с 0,5 до 0,2.

Мы видим, что, сохраняя порог равным 0,2, мы достигаем точности до 95 %. Давайте посмотрим, что произойдет, если мы изменим пороговое значение.

В приведенном выше коде мы изменили метрику нашей модели на точность_мульти с порогом = 0,1. Когда мы делаем learn.validate(), обучаемый объект вычисляет потери и точность наших проверочных данных. Поскольку мы только меняем метрику, нет необходимости обучать модель. Из приведенного выше вывода мы видим, что когда порог = 0,1, мы получаем точность 93%, что меньше по сравнению с нашим предыдущим результатом. Давайте теперь проверим более высокое пороговое значение.

Когда мы имеем более высокое пороговое значение, то есть порог = 0,99, мы видим, что точность составляет 94%. Таким образом, мы можем сделать вывод, что выбор порогового значения зависит от данных, которые мы используем, а не от фиксированного значения, которое следует использовать всегда.

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

Заключение

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

Спасибо

Ссылка на GitHub для Блокнота здесь. Профиль LinkedIn здесь.