В рамках стипендии Bertelsmann AI Udacity ученые не только должны закончить курс AI Udacity, но и бросают вызов друг другу, чтобы применить навыки и знания, которые они собирают и применяют во время курса. Одна из таких задач - это испытание по классификации знаков китайского зодиака. По случаю, вы знаете, китайского лунного Нового года.

Китайский зодиак разделен на двенадцать годовых циклов, каждый год определяется определенным животным.

Я подумал, что это будет интересная задача, поэтому сразу же погрузился в нее.

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

Настройте среду

Перво-наперво. Использование графического процессора облегчило бы задачу, поэтому я попытался использовать как Google Colab, так и Kaggle Notebook, чтобы построить эту модель. Но поскольку мне нравится иметь возможность редактировать (добавлять, изменять, перемещать или удалять) свои данные, я предпочитаю использовать Google Colab, поскольку данные хранятся на моем Google Диске.

Загрузите и проверьте данные

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

Давайте сначала проверим распределение этих данных.

Итак, для каждого обучения у нас есть 600 обучающих изображений (одно сокращенное для goat), 54 проверочных изображения (одно дополнительное для goat, что, вероятно, связано с тем, что это одно изображение было потеряно) и 54-55 тестовых изображений.

Мне нравится.

Давайте посмотрим на образцы этих изображений.

Мне тоже нравится. Мы также можем видеть, что мы также добавляем рисованные изображения (потому что драконов не существует и все такое).

Создание модели с помощью Pytorch

Одно из преимуществ Pytorch (а также других фреймворков машинного обучения / глубокого обучения) заключается в том, что он дает нам упрощенные стандартные коды. Один из них - загрузка данных train-val-test.

Теперь построим модель.

Я буду использовать предварительно обученную модель Resnet34, чтобы передать полученные знания для построения этой модели классификации. Я также пробовал другие предварительно обученные модели, такие как Resnet101 и VGG 19 с BatchNorm, но Resnet34 дает мне довольно хорошую производительность, поэтому я продолжаю это делать. Resnet34 требует, чтобы входные изображения имели ширину и высоту 224.

Полная архитектура модели представлена ​​ниже.

Я не буду использовать здесь ничего очень сложного. Всего два дополнительных FC-слоя с 512 нейронами в каждом и один выходной слой с 12 нейронами (разумеется, по одному для каждого класса знаков зодиака).

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

Теперь начинается первая увлекательная часть - обучение модели.

Нам просто нужно перебрать загрузчик данных поезда при выполнении (а) прямого и обратного прохода модели и (б) измерения текущих / рабочих характеристик модели. Я предпочитаю выполнять пункт (b) каждые 100 мини-партий.

Я выбрал для обучения модель 7-15 эпох. Вы увидите, почему, на этой диаграмме ниже.

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

Но когда мы смотрим на другие модели с другой архитектурой, происходит то же самое.

Вторая модель с Resnet50, почти такая же, как и первая, за исключением того, что я изменил скорость обучения с 0,001 на 0,003. Третий - использование VGG 19 с пакетной нормой и скоростью обучения 0,001.

Три разные модели + параметры рассказывают одну и ту же историю - показатели точности при проверке не улучшаются значительно после нескольких эпох, а не так сильно, как при обучении (особенно для последних двух моделей).

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

Протестируйте модель

Давайте посмотрим, действительно ли модели хороши или разваливаются на части в соответствии с тестовым набором данных.

  • ResNet (lr 0,001) - потеря: 0,355 в соотв .: 90,5%
  • ResNet (lr 0,003) - потеря: 0,385 в соотв .: 90,6%
  • VGG 19 с нормой партии - потери: 0,586 в соотв .: 90,8%

Если посмотреть на точность, они почти не отличаются. Что касается потерь, то ResNet с 0,001 фунта царит безраздельно. Эти числа почти такие же, как и при обучении и проверке, поэтому мы можем сказать, что наша модель не переоснащается (или, по крайней мере, мы остановили ее незадолго до того, как это произошло с нашей маленькой эпохой), и довольно хорошо работает для классификации китайских знаков зодиака.

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

Любить числа в этой матрице путаницы.

Мы видим, что модель редко ошибается с goat, но если и ошибается, то всегда с ox (рогами).

Мы также можем видеть, что модели было немного трудно отличить dragon от других знаков зодиака. В первую очередь с oxes (рога) и snake (тело).

Заключительные слова

Работа над классификацией китайских знаков зодиака во время стипендии Bertelsmann AI Udacity была потрясающей и освежающей. Это подтолкнуло и мотивировало меня заниматься любимым делом - экспериментировать и создавать в области ИИ / машинного обучения / глубокого обучения.

Придут новые испытания, и я с нетерпением жду этого.

Вы можете проверить мои записные книжки на моей странице Github. Пожалуйста, просмотрите и подписывайтесь :))