В рамках стипендии 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. Пожалуйста, просмотрите и подписывайтесь :))