IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM   Привет Хабр! В очередном продолжении темы компьютерного зрения. Сегодня мы сосредоточимся на обратных вызовах, EarlyStopping и LearningRateScheduler.Мы уже научились создавать, обучать и оценивать сверточные нейронные сети. Сегодня мы сосредоточимся на дополнительных инструментах, которые обычно используются для достижения лучших результатов: обратные вызовы.Давайте создадим файл Python, который будет содержать функции для очистки наших изображений тренировки/теста и создания модели, чтобы мы могли использовать ее непосредственно на последующих шагах.touch preparation.pyОткрываем только что созданный файл prepare.py. Что произойдет, если мы запустим слишком много эпох? Скорее всего, модель «переоснащает» обучающие данные, что означает, что она «слишком идеально подходит» к обучающим данным, и начинает хуже работать с тестовыми данными. Мы хотим избежать этого. Было бы здорово, если бы мы могли остановить обучение, когда достигнем максимальной точности (или любого другого ценного показателя)? Например, если мы отслеживаем точность, мы должны иметь возможность остановить обучение, если точность нашей модели перестала улучшаться в течение n последовательных эпох. К счастью, мы можем сделать это с помощью обратного вызова с ранней остановкой! Давайте создадим новый файл, в котором будет находиться наш код:touch step1.py Открываем только что созданный файл step1.py. Мы будем использовать тот же набор данных Fashion MNIST. Мы добавляем весь следующий код, который будет импортировать библиотеки, очищать данные для обучения и создавать модель. Давайте выполним кодpython step1.py Давайте теперь определим обратный вызов, чтобы включить его, когда мы собираемся соответствовать модели. Аргументы включают: monitor: передает точность для контроля в экземпляре обратного вызова EarlyStopping mode: max, так как мы стремимся к максимальной точности; для потери, это было бы мин min_delta = 0,001: минимальное изменение отслеживаемой величины, которое можно квалифицировать как улучшение, т. е. абсолютное изменение меньше, чем min_delta, не будет считаться улучшением. patience: количество эпох без улучшения, после которых обучение будет остановлено Определив наш обратный вызов, мы теперь перейдем к компиляции и подгонке нашей модели.Давайте теперь скомпилируем, подгоним модель и построим график, чтобы увидеть, что произошло. Добавьте обратный вызов в метод model.fit: Выполним код, чтобы просмотреть выходные данные и графики. Это может занять некоторое время, так что можно заварить кофе, пока ждемpython step1.py Щелкните по accuracy_plot_1.png, чтобы просмотреть график точности. Нажмите loss_plot_1.png, чтобы визуализировать график потерь. Вы можете видеть, что по мере того, как точность модели начала снижаться после достижения максимума, обратный вызов EarlyStopping позволил модели остановиться в этой точке. У каждого оптимизатора (который мы устанавливаем в методе компиляции) есть аргумент скорости обучения. Хотя он принимает значение по умолчанию, это параметр, требующий настройки. Слишком низкое значение потребует много времени (больше эпох) для достижения хорошей точности уровня, а слишком высокое значение будет превышать минимум и просто колебаться при плохих значениях точности. В любом случае, один из способов работать со скоростью обучения — зафиксировать ее на средне-высоком значении, а затем уменьшать ее в каждую эпоху. Это приводит к большим шагам к минимуму в начале, но к более медленным шагам через некоторое время. Мы можем сделать это с помощью LearningRateScheduler. Посмотрим как! Мы создаем новый файл, в котором будет находиться наш код:touch step2.py Открываем только что созданный нами файл step2.pyМы будем использовать тот же набор данных Fashion MNIST. Добавьте весь следующий код, который будет импортировать библиотеки, очищать данные для обучения и создавать модель. Не беспокойтесь о двух функциях, которые мы импортируем; мы просто хотим иметь возможность быстро очистить данные и получить модель. Давайте теперь определим обратный вызов, чтобы включить точку, в которой мы будем соответствовать модели. Аргументы: scheduler: функция, которая принимает индекс эпохи (целое число, индексированное от 0) и текущую скорость обучения (с плавающей запятой) в качестве входных данных и возвращает новую скорость обучения в качестве вывода (с плавающей запятой) verbose: int. 0: quiet, 1: обновить сообщения Определив наш обратный вызов, мы теперь перейдем к компиляции и подгонке нашей модели.Давайте теперь скомпилируем, подгоним модель и построим график, чтобы посмотреть, что происходит. Кроме того, проверьте параметр скорости обучения в оптимизаторе Adam в методе компиляции. Открываем файл: step2.py. Мы выполняем код для просмотра вывода и графиков. Посмотрите на выходные данные model.fit() и на то, как скорость обучения уменьшается в зависимости от функции планировщика. Подгонка может занять некоторое время.python step2.py Щелкните по accuracy_plot_2.png, чтобы просмотреть график точности. Нажмите loss_plot_2.png, чтобы визуализировать график потерь.  Preparation.py: Step1.py Step2.py  В заключение статьи приглашаю всех желающих на бесплатный урок по теме «Kornia - убийца OpenCV?», на котором участники узнают: Почему Kornia применяется в обучении нейронных сетей и PyTorch, а OpenCV - нет. За счет чего Kornia работает в разы быстрее, чем OpenCV. Какие продвинутые функции потерь и алгоритмы для моделей Компьютерного Зрения предоставляет Kornia. Как написать алгоритм, которые автоматически сшивает несколько фотографий в панорамный снимок. Почему Kornia – это лучший инструмент для задач, связанных с геометрией изображений. Регистрация на мероприятие открыта по ссылке.  Редактор