Цель

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

Предыдущий урок:



Создание приложения машинного обучения с нуля
Бэкенд и внешний интерфейс приложения машинного обучения.medium.com



Делать просто приложение не обязательно, иногда нам нужно обновлять нашу модель. А для этого нам нужно постоянно обучать нашу модель. Переобучение модели — очень важный шаг в производственных приложениях. Подобно тому, как Netflix может использовать какую-то модель, чтобы дать пользователям некоторые рекомендации, они должны обновить свою модель через некоторое время с помощью последних данных, иначе они не будут давать правильных рекомендаций.

В этом посте мы рассмотрим один из способов переобучения нашей модели после получения пользовательских данных. Мы будем использовать задания cron (для систем на базе Linux) или запланированные задачи (для систем на основе Windows).

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

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

В этом уроке мы будем переобучать нашу модель через 15 минут. Этот временной интервал предназначен только для целей тестирования.

Сначала давайте составим список задач, которые мы собираемся выполнить при создании этой функции переобучения:

  1. Сбор данных путем получения информации от пользователей.
  2. Делаем наш сценарий обучения.
  3. Запланируйте наш сценарий обучения.

Теперь давайте начнем строить наш механизм сбора данных.

Сбор данных:

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

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

Также нам не нужен простой выпадающий список с тысячами значений, который усложняет поиск нужного класса изображения. Мы будем использовать окно выбора с возможностью поиска. Здесь мы будем использовать библиотеку select2, которая очень упростит нашу задачу. Спасибо нашему замечательному сообществу веб-разработчиков, которое предоставило нам такие библиотеки для облегчения наших задач. Вы можете прочитать больше об этом здесь:

Начало работы | Select2 — замена jQuery для полей выбора

Эти библиотеки очень упростили нашу задачу. И пользоваться ими тоже очень легко.

Для использования select2 нам просто нужно добавить его файл css и файл javascript. Наряду с файлом javascript select2 нам также необходимо включить jquery, поскольку select2 зависит от jquery.

Добавьте приведенную ниже строку в тег head, чтобы включить файл CSS select2.

‹link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css rel="stylesheet" /›

Добавьте строку ниже после конца тега body, чтобы включить jquery и javascript для select2:

‹script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js›‹/script›

‹! — javascript для выбора с возможностью поиска →

‹script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js›‹/script›

Теперь мы готовы сделать окно выбора с возможностью поиска.

Ниже приведен пример скрипта для создания поля выбора в html.

‹выберите class="class_label" name="input_class" style="width: 100%"›

‹option value="Кот"›Кот‹/option›

‹option value="Собака"›Собака‹/option›

Мы указали класс вышеуказанного элемента как class_label и имя как input_class.

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

‹script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js›‹/script›

‹! — javascript для выбора с возможностью поиска →

‹script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js›‹/script›

‹скрипт›

$(документ).готовый(функция(){

$(“.class_label”).select2();

});

‹/скрипт›

Итак, как вы можете видеть в теге script выше, есть фрагмент кода. Давайте разберем код для новичков в javascript. $(document).ready(function(){//code here}); поэтому любой код, написанный внутри этого оператора, будет запущен после загрузки всех компонентов на странице. $(“.class_label”).select2(); этот оператор сделает все элементы, имеющие класс «class_label» типа select2. Как это работает и что такое jquery, все эти вопросы выходят за рамки данной статьи. Если вы хотите узнать больше о jquery и javascript, посетите здесь

Введение в JavaScript

Учебник по jQuery

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

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

Обновленные функции индексирования и загрузки изображений приведены ниже:

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

Вы можете видеть, что мы использовали шаблон django для цикла, чтобы показать раскрывающийся список классов, также мы указали URL-адрес в параметре действия нашей формы исправления. Теперь мы напишем функцию, которая будет сопоставлена ​​с этим URL-адресом.

Но перед этим мы настроим нашу структуру папок для сохранения файлов. Создайте папку с именем «модель» внутри каталога вашего проекта. Тот же путь, где присутствует manage.py.

Внутри этой папки модели мы создадим 4 подпапки с именами:

  • training_samples — хранит изображения, на которых будет обучаться модель.
  • trained_sample — изображения, на которых наша модель уже обучена.
  • current_model — последняя версия модели
  • old_models — старые версии модели

Ваша папка будет выглядеть так:

Мы будем следовать приведенному выше алгоритму, чтобы переобучить нашу модель.

Сохранение обучающих образцов:

Теперь нам нужно написать функцию в views.py, которая сохранит исправленный класс и путь к загруженному пользователем изображению в папку training_samples. Ниже приведена функция, которая будет вызываться при отправке исправленной формы ярлыка.

Теперь мы сопоставим эту функцию с URL-адресом, чтобы мы вызывали URL-адрес из формы, и эта функция вызывалась.

Обновленный файл urls.py будет выглядеть следующим образом:

Итак, запустите приложение, и если все в порядке, то при отправке формы отправленное изображение будет сохранено в папке model/training_samples/ с меткой в ​​имени файла.

Подготовка сценария обучения модели:

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

  1. Загрузите существующую модель из каталога current_model. (Назовем эту модель моделью-1)
  2. Используйте обучающие образцы и обучите загруженную модель.
  3. После успешного обучения модели (модель-2) сохраните старую модель (модель-1) в каталоге old_model.
  4. Замените модель в каталоге current_model на модель-2, которая является нашей последней моделью.

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

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

Я взял код с веб-сайта ниже, и вы можете узнать больше об обучении модели pytorch на этом веб-сайте.

https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html

Также в этом коде мы переопределяем класс набора данных pytorch. Вы можете прочитать больше о создании пользовательских наборов данных здесь:

https://pytorch.org/tutorials/beginner/data_loading_tutorial.html

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

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

В основном веб-приложения размещаются в системах Linux, поэтому мы запланируем этот скрипт с помощью задания cron.

Для пользователей Windows они могут сделать это с помощью планирования задач.

Планирование сценария обучения

Задание Cron:

Откройте окно терминала.

Введите команду ниже, чтобы открыть файл crontab.

crontab -e

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

Напишите ниже код в файле:

0,15,30,45,59 * * * * cd path_to_vironment_scripts_folder && . активировать && cd path_to_your_training_script && /usr/bin/python3.6 training_script.py ›› training.out

Итак, в приведенной выше команде

  1. Сначала мы переходим в каталог окружения.
  2. Активация среды
  3. Переход в директорию, в которой находится обучающий скрипт
  4. Запуск сценария обучения с использованием установленного местоположения Python.

Таким образом, приведенная выше команда будет запускать сценарий обучения каждые 15 минут и сохранять журналы в файле training.out.

Вы можете посмотреть следующее видео на YouTube, чтобы узнать о планировании задач в Linux с помощью задания cron.

https://www.youtube.com/watch?v=Q2CNZGEH59Q

Для Windows:

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

  1. Откройте приложение планировщика заданий
  2. Нажмите на опцию создать задачу.
  3. Дайте любое название задаче.
  4. Нажмите на вкладку действия.
  5. Нажмите новый.
  6. В окне программы/скрипта найдите python, установленный в вашей среде. Как и в моем случае, это расположение «C:\ALL DATA\Machine_Learning_Pipeline\image_classifier\env\Scripts\python.exe»
  7. В разделе аргументов укажите местоположение training_script.py. Например, training_script.py
  8. В разделе strat in укажите место, где находится обучающий скрипт. Например, C:\ALL DATA\Machine_Learning_Pipeline\image_classifier\image_classifier\
  9. Теперь перейдите на вкладку Триггеры и создайте новый триггер.
  10. Это довольно интуитивно понятно и позволяет запускать задание каждые 15 минут.
  11. Теперь нажмите OK, и ваша задача будет создана.
  12. Теперь щелкните библиотеку планировщика задач и выберите задачу, щелкните правой кнопкой мыши и выберите "Выполнить".

Вы можете посмотреть следующее видео на YouTube, чтобы узнать о планировании задач в Windows.

https://www.youtube.com/watch?time_continue=237&v=n2Cr_YRQk7o&feature=emb_logo

Ура!! Вы создали скрипт для переобучения модели, и теперь модель будет обучаться автоматически.

Ссылка на гит-хаб: