Моя вторая попытка пройти Урок 2 «Практического глубокого обучения для программистов» от fast.ai

Я прорабатываю Урок 2 изумительного курса Практическое глубокое обучение для программистов Джереми Ховарда и Рэйчел Томас из fast.ai, а на прошлой неделе я обучил модель глубокого обучения классифицировать изображения тестов на беременность. Результаты которого не были однозначно положительными или отрицательными, но были либо слабо положительными, либо с линиями испарения. Однако точность модели была не такой, какой я хотел, поэтому я решил начать снова с проблемы классификации, для которой я мог бы легко получить лучшие наборы изображений, чем я мог бы для сложной задачи классификации теста на беременность. Затем я попытался обучить модель классифицировать секвойи и секвойи, но снова добился очень низкого уровня точности, при этом большинство ошибок приходилось на секвойи, классифицируемые как секвойи. Стволы секвойи намного больше, чем секвойи, но на изображениях бывает сложно понять масштаб, и я думаю, что эта проблема, скорее всего, является причиной того, что модель ошибочно приняла секвойи за секвойи.

Итак, мне снова нужна новая проблема. Я считаю, что классифицировать картины как написанные либо Моне, либо Мане, но я считаю, что моей собственной способности различать эти две картины недостаточно для проверки точности модели, поэтому я решаю вместо этого попробовать Пикассо против Моне. Я хочу иметь возможность сравнивать точность моей модели с точностью другой и не могу найти модель глубокого обучения для этой проблемы, но нахожу исследование, которое обучило несколько наборов голубей распознавать картины Пикассо и Моне с более чем 90%. точность"! Я считаю, что победа над голубями - приемлемый первый тест для моей модели.

Следуя инструкциям лекции Урока 2, я ищу «картины Пикассо» и «Картины Моне» в Картинках Google и загружаю оба набора изображений (см. Мой предыдущий пост, чтобы узнать о небольших изменениях, которые мне нужно было внести в код для этого в разделе ноутбук).

В первый раз моя модель обгоняет голубей!

Моя потеря обучающего набора составляет 0,396, тогда как потеря моего набора проверки составляет 0,086, а мой коэффициент ошибок составляет 0,278. Это будет сложно улучшить! Тем не менее, мое паучье чутье вызывает у меня пинг, потому что потеря моего тренировочного набора выше, чем у моего набора проверки, и я думаю, что Джереми сказал в лекции, что это признак переобучения. Я ищу и нахожу этот пост на форуме fast.ai, в котором Джереми говорит, что пока количество ошибок невелико, небольшое переоснащение допустимо. Ух!

Теперь перейдем к настройке гиперпараметров, хотя точность настолько высока, что я совершенно не уверен, что смогу ее значительно повысить. Я запускаю средство поиска скорости обучения и пытаюсь построить график, но он отображается пустым. В записной книжке есть подсказка, в которой говорится, что если график поиска скорости обучения пуст, попробуйте запустить learn.lr_find(start_lr=1e-5, end_lr=1e-1.

Это работает! Вот график.

Основываясь на графике, я установил скорость обучения от 1e-6 до 1e-4:

Я значительно снизил потери как в тренировочном наборе, так и в валидационном, но частота ошибок, по сути, такая же (чего я и ожидал). Модель допустила только одну ошибку, причислив Пикассо к Моне.

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

Затем я собираюсь запустить свою модель в производство в веб-приложении. Раньше я играл с HTML и CSS, и, как и я, носящий карты Millennial, у меня уже давно был сайт Geocities, но я никогда не создавал веб-приложение. Джереми говорит: «Создайте веб-приложение», как я мог бы сказать «Сделайте кофе», так что, может быть, это будет относительно легко?

Я следую инструкциям fast.ai по развертыванию на Render и создаю форк предоставленного репо. Я столкнулся с небольшим препятствием: инструкции говорят нам отредактировать файл server.py в каталоге app, но я не могу найти его нигде в дереве каталогов Jupyter. В конце концов, я понимаю, что каталог app находится в разветвленном репо на GitHub, а не в Jupyter! Может быть, для кого-то это было бы очевидно, но не для меня. Следующая небольшая загвоздка заключается в том, что переменная, которую нам нужно отредактировать в файле server.py, называется export_file_url, а не model_file_url, как указано в инструкциях. Ничего страшного.

Я продолжаю следовать инструкциям по развертыванию, но мое веб-приложение не удается развернуть, и я получаю эту ошибку в своих журналах на Render: TypeError: __call__() missing 2 required positional arguments: 'receive' and 'send'. Я понятия не имею, что это означает, поэтому я просматриваю форумы fast.ai и нахожу ветку, посвященную этой проблеме. По-видимому, в разветвленном репозитории есть файл с именем requirements.txt, которому нужны номера версий различных библиотек, с которыми работает моя модель. Нахожу свой файл requirements.txt, создаю в записной книжке новую ячейку и в ней run! pip list. Я нахожу большинство значений, которые ищут в файле requirements.txt, но нет записи для starlette, aiofiles или aiohttp. Я копирую и вставляю значения, приведенные в последней публикации в цепочке, скрещивая пальцы, но это не работает.

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

Прогресс! Мое веб-приложение развертывается, но, похоже, по умолчанию используется пример классификатора плюшевого мишки, который указан по умолчанию в репозитории. Я обновил URL-ссылку в файле server.py, но поскольку размер файла export.pkl меньше 100 МБ, я не сгенерировал ключ API в первый раз. Возможно, он мне нужен, поэтому на этот раз я следую этим инструкциям. Я снова редактирую файл server.py с новой ссылкой и повторно развертываю. Неа, все еще несет.

В server.py все еще есть пример ссылки, но, похоже, он закомментирован. Попробую удалить? Но я также отредактировал классы, чтобы они были «пикассо» и «моне» вместо типов медведей, так что они тоже должны были измениться. Хм ... а что, если бы они сделали? Может быть, он выглядит как классификатор медведей, но на самом деле это мой классификатор рисования?

Я следую совету Helpful Worm и все равно пытаюсь запустить его ̶ w̶a̶l̶k̶i̶n̶g̶ ̶t̶h̶r̶o̶u̶g̶h̶ ̶i̶t̶.

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

Я вижу, что мне нужно где-то отредактировать код для текста, обращенного к пользователю, но не могу понять, где это сделать. Замечательно полезный mrfabulous1 на форумах fast.ai снова приходит ко мне и сообщает мне, что код, который мне нужно отредактировать, - это файл index.html в подкаталоге view каталога app. Оно работает!

Попробуйте мой Пикассо или Моне? классификатор для себя здесь!

Итак, теперь у меня есть модель классификации изображений с точностью 97% и развернутое веб-приложение для игры с ней. Переходим к Уроку 3!

Смотрите код на GitHub!

Другие сообщения по этой теме:

Урок 1: Начало работы с fast.ai

Урок 2 (попытка 1): Классификация результатов теста на беременность!

Урок 3: 10 000 способов, которые не работают

Урок 4: Прогнозирование чаевых официанту

Урок 5: А где же рассол?

Урок 6: Все хотят быть кошками

Я преподаватель математики в CSU East Bay и начинающий аналитик данных. Свяжитесь со мной в LinkedIn или поздоровайтесь в Twitter.