Внутри ИИ
Классификация болезней растений с помощью Monk
Использование поисковика моделей для автоматического определения правильных гиперпараметров
TL; DR
В сельском хозяйстве болезни листьев вызывают значительное снижение как качества, так и количества урожая. Автоматизация обнаружения болезней растений с помощью компьютерного зрения может сыграть роль в раннем обнаружении и профилактике заболеваний.
Что будешь строить!
В этом упражнении мы исследуем, как создать классификатор болезней листьев растений, используя быструю функцию поиска гиперпараметров Монка.
Monk предоставляет инвариантную синтаксическую структуру обучения передачи, которая поддерживает Keras, Pytorch и Mxnet в бэкэнде. (Читать - Документация).
Разработчики компьютерного зрения должны изучить стратегии, выбирая правильную скорость обучения, подходящую архитектуру CNN, использовать правильные оптимизаторы и точно настраивать многие другие параметры, чтобы получить наиболее эффективные модели.
Функции поиска гиперпараметров помогают проанализировать несколько вариантов для выбранного гиперпараметра, прежде чем приступить к фактическому эксперименту. Это не только экономит время, затрачиваемое на создание прототипа, но также помогает быстро изучить, насколько хорошо выбранный набор параметров работает с используемым набором данных и конечным приложением.
Давайте начнем!
Настраивать
Начнем с настройки Monk и его зависимостей от colab. Для дальнейших инструкций по установке на различных платформах загляните в DOCS.
$ git clone https://github.com/Tessellate-Imaging/monk_v1 $ cd monk_v1/installation && pip install -r requirements_cu10.txt $ cd ../..
Набор данных
Для этого упражнения мы будем использовать набор данных, собранный замечательными людьми из PlantVillage.
Экспериментирование
Перед настройкой нашего анализа мы должны начать с создания нового проекта и поэкспериментировать.
# Step 1 - Create experiment ptf = prototype(verbose=1); ptf.Prototype("plant_disease", "exp1");
и настройте пути к наборам данных «По умолчанию»
ptf.Default(dataset_path=["./dataset/train", "./dataset/val"], model_name="resnet18", freeze_base_network=True, num_epochs=5);
Теперь мы готовы провести некоторый анализ и найти лучшие гиперпараметры.
В настоящее время мы можем проанализировать следующие параметры:
- Найдите лучшую архитектуру CNN - [DOCS]
- Найдите подходящий размер партии - [DOCS]
- Найдите подходящую форму ввода - [DOCS]
- Выберите хорошую начальную скорость обучения - [DOCS]
- Выберите наиболее эффективный оптимизатор - [DOCS]
Мы проанализируем каждый из вышеперечисленных параметров, чтобы выбрать лучший, и, наконец, обучим нашу модель построению приложения классификации болезней листьев растений.
Поиск моделей
Начните с названия анализа. Для каждого анализа создается новый проект с множеством экспериментов внутри.
analysis_name = “Model_Finder”;
Теперь перейдем к списку моделей для анализа.
- Первый элемент в списке - Название модели
- Второй элемент в списке - логическое значение, чтобы заморозить базовую сеть или нет
- Третий элемент в списке - логическое значение для использования предварительно обученной модели в качестве отправной точки или нет
models = [[“resnet34”, True, True], [“resnet50”, False, True],[“densenet121”, False, True], [“densenet169”, True, True], [“densenet201”, True, True]];
Задайте количество эпох для каждого эксперимента.
epochs=5;
Выберите процент от исходного набора данных для экспериментов.
percent_data=10;
Наконец, мы запускаем функцию анализа для поиска наиболее эффективных моделей:
- «Keep_all» - сохраняет все созданные эксперименты.
- «Keep_none» - удаляет все созданные эксперименты.
ptf.Analyse_Models(analysis_name, models, percent_data, num_epochs=epochs, state=”keep_none”);
Во время анализа отображается расчетное время для каждого эксперимента.
Running Model analysis Analysis Name : Model_Finder Running experiment : 1/5 Experiment name : Model_resnet34_freeze_base_pretrained Estimated time : 2 min
Наконец, после завершения эксперимента мы получаем следующий вывод о точности и потерях обучения и проверки:
Выберите наиболее эффективную архитектуру CNN, обновите свой эксперимент и продолжайте дальнейший анализ. Не забудьте перезагрузить эксперимент после обновления.
## Update Model Architecture ptf.update_model_name(“densenet121”); ptf.update_freeze_base_network(False); ptf.update_use_pretrained(True); ptf.Reload();
Дальнейшие инструкции по обновлению параметров эксперимента можно найти в документации.
Остальные четыре анализа следуют аналогичному синтаксису. Мы быстро рассмотрим каждый из них:
Поиск размера партии
# Analysis Project Name analysis_name = “Batch_Size_Finder”; # Batch sizes to explore batch_sizes = [4, 8, 16, 32]; # Num epochs for each experiment to run epochs = 10; # Percentage of original dataset to take in for experimentation percent_data = 10; ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data, num_epochs=epochs, state=”keep_none”);
Сгенерированный вывод:
Обновите эксперимент:
## Update Batch Size ptf.update_batch_size(8); ptf.Reload();
Поиск формы ввода
# Analysis Project Name analysis_name = “Input_Size_Finder”; # Input sizes to explore input_sizes = [224, 256, 512]; # Num epochs for each experiment to run epochs=5; # Percentage of original dataset to take in for experimentation percent_data=10; ptf.Analyse_Input_Sizes(analysis_name, input_sizes, percent_data, num_epochs=epochs, state=”keep_none”);
Сгенерированный вывод:
Обновите эксперимент:
## Update Input Size ptf.update_input_size(224); ptf.Reload();
Анализ скорости обучения
# Analysis Project Name analysis_name = “Learning_Rate_Finder” # Learning rates to explore lrs = [0.01, 0.005, 0.001, 0.0001]; # Num epochs for each experiment to run epochs=5 # Percentage of original dataset to take in for experimentation percent_data=10 ptf.Analyse_Learning_Rates(analysis_name, lrs, percent_data, num_epochs=epochs, state=”keep_none”);
Сгенерированный вывод:
Обновите эксперимент:
## Update Learning Rate ptf.update_learning_rate(0.01); ptf.Reload();
Оптимизатор анализа
# Analysis Project Name analysis_name = “Optimiser_Finder”; # Optimizers to explore optimizers = [“sgd”, “adam”, “adamax”, “rmsprop”]; #Model name, learning rate # Num epochs for each experiment to run epochs = 5; # Percentage of original dataset to take in for experimentation percent_data = 10; ptf.Analyse_Optimizers(analysis_name, optimizers, percent_data, num_epochs=epochs, state=”keep_none”);
Сгенерированный вывод:
Обновите эксперимент:
## Update Optimiser ptf.optimizer_adamax(0.001); ptf.Reload();
Обучение
Наконец, после установки правильных гиперпараметров, мы можем начать обучение модели.
ptf.Train();
Копировать эксперимент
Мы можем визуализировать графики точности и потерь, расположенные внутри каталога рабочей области. Из графиков мы видим, что потери могут идти дальше вниз:
Чтобы продолжить обучение, мы копируем наш предыдущий эксперимент и выходим из этого состояния - [DOCS]
Сравнить эксперименты
После завершения обучения мы можем сравнить оба этих эксперимента, чтобы проверить, действительно ли мы улучшили производительность с помощью функции Сравнить эксперимент в Monk.
Наш «эксперимент 1» длился 5 эпох, а «эксперимент 2» - 10 эпох. Несмотря на небольшое улучшение точности проверки, увеличение с 96% до 97% могло бы помочь достичь позиций в таблице лидеров для соревнований, проводимых на Kaggle и EvalAi.
Надеюсь, вам понравится создавать нишевые решения с помощью наших инструментов.
Чтобы зарегистрироваться в качестве бета-тестера наших инструментов, посетите наш сайт.
Удачного кодирования!