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

  1. Какую проблему мы пытаемся решить?
  2. Как построить модель, которая поможет решить этот вопрос?

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

Лучше всего это показать на примере. Предположим, мы пытаемся создать алгоритм, который помогает правильно сортировать отходы на основе фотографии. Что касается выбора самого алгоритма, то он будет зависеть от поставленной задачи. Мы могли бы использовать случайные леса решений или машины опорных векторов после извлечения соответствующих функций из изображения. Мы также могли бы использовать сверточные нейронные сети, которые работают непосредственно с данными изображения. Мы можем сами спроектировать архитектуру этой сети. Однако стоит рассмотреть предварительно обученную модель, которая позволит сэкономить много времени. Чтобы решить эту проблему, я решил использовать предварительно обученные искусственные нейронные сети для классификации изображений. Как это выглядит на практике? Давайте рассмотрим процесс шаг за шагом.

Анализ и подготовка данных

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

Очень важным этапом подготовки набора данных является разделение его как минимум на два подмножества: подмножества обучения и проверки. Еще лучше создать три отдельных набора данных: обучение, проверка и тестирование. В этом случае результаты, полученные на тестовой выборке, являются репрезентативными и показывают реальную эффективность системы для новых, ранее невидимых фотографий. В моем случае 60% фотографий использовались для обучения, 20% были набором для проверки, а еще 20% попали в набор для тестирования.

Ниже приведены образцы фотографий для каждого класса. Каждая фотография имеет размер 512 х 384 пикселей. При использовании готовой нейронной сети очень важно подогнать размер изображений в наборе к размеру входных данных, принимаемых сетью. В случае сети Xception размер входного слоя составляет 299 x 299, а в случае сети VGG16 этот размер составляет 224 x 224. Поэтому перед обучением модели нам нужно масштабировать наши изображения.

Подготовка и обучение моделей

Для решения данной проблемы я использовал две популярные сетевые архитектуры: VGG16 и Xception. Обе выбранные мной модели были предварительно обучены в коллекции ImageNet, которая содержит изображения объектов, принадлежащих к 1000 классам. Следовательно, выходной слой, отвечающий за классификацию входного изображения, имеет 1000 выходов. В случае проблемы, которую мы анализируем, размер выходного слоя должен быть 5. Ниже приведен код, который позволяет адаптировать предварительно обученную модель к нашему набору данных.

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

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

Эффективность созданных решений

Как я упоминал ранее, лучше всего определять фактическую эффективность нашей модели на новом наборе данных, который не участвовал в обучении наших моделей. Поэтому ниже я представляю результаты, которых удалось достичь, позволив моделям справиться с набором тестов. Эта коллекция содержала 480 фотографий. Результаты подтверждают вывод о том, что в этом случае модель, основанная на предварительно обученной сети Xception, показала себя намного лучше. Достигнута эффективность 83%, что почти на 10 процентных пунктов больше, чем у модели, основанной на архитектуре VGG16.

Резюме

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

Это первая из серии статей, предназначенных для людей, которые хотят начать свои приключения с алгоритмами искусственного интеллекта. Я приглашаю вас следить за нашими записями в блоге Isolution и профилями нашей компании в LI и FB, а также подписаться на нашу рассылку новостей.