Что мне делать, если тренировка с fit_one_cycle была прервана на полпути?

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

  • потому что вы достигли 12 часов непрерывной «бесплатной» работы на ноутбуке Google Colab;
  • вы временно потеряли связь с Colab или Kaggle;
  • потому что ваш компьютер по какой-то причине остановился. Я живу в Бразилии, и перебои с электричеством - обычное дело ...

Метод fit_one_cycle (), используемый fast.ai, работает с различными адаптивными скоростями обучения и импульсами, следуя кривой, где скорость сначала увеличивается, а затем уменьшается, тогда как импульс обрабатывается противоположным образом, как показано на рисунке ниже.

Если вы прервете тренировку в эпоху № 10, например, из 20 эпох, а затем начнете снова еще в течение 9 эпох, у вас не будет такого же результата, как при непрерывной тренировке в течение 20 эпох, потому что новое обучение с нуля, даже если вы загрузите веса из прошлой эпохи, будет использовать новую политику скорости обучения и импульса и снова пройти цикл. Вы хотите начать с того места, где вас прервали в цикле.

Что такое fit1cycle?

Fit1cycle - это политика сверхконвергенции, разработанная Лесли Н. Смит. Он используется в качестве стандартной политики обучения в fast.ai. Подробнее см. Ниже:

Если вы хотите просмотреть другие статьи, перейдите по этой ссылке: Статьи Лесли Н. Смит. Мы не будем вдаваться в подробности в этой публикации. На Medium есть несколько сообщений, в которых в удобной для чтения форме представлена ​​и обсуждается политика обучения fit1cycle:

В последней публикации Кушайвира Сингха есть очень наглядный блокнот Jupyter, на который стоит взглянуть. Также есть очень интересная статья из Nachiket Tanksale под названием В поисках хорошей скорости обучения и политики одного цикла, в которой обсуждаются циклические темпы и скорость обучения.

Как мне возобновить обучение?

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

# Do not forget to import the callback function
from fastai.callbacks import SaveModelCallback
# Train with the callback function set to save weights every epoch
learn.fit_one_cycle(20, max_lr=slice(1e-5,1e-6), 
       callbacks=[SaveModelCallback(learn, every='epoch',  
                  monitor='accuracy', name='saved_net')])

Таким образом, ваша сеть будет сохраняться каждую эпоху с указанным вами именем, за которым следует _ # epoch. Итак, в эпоху № 3 будет записан файл saved_net_3.pth. Этот файл вы можете загрузить после того, как:

  • повторно создал DataBunch и
  • повторно создал сеть с этим конкретным DataBunch.

После перезагрузки файла .pth вы можете перезапустить тренировку, только вы снова скажете fit_one_cycle, чтобы учесть 20 эпох, но начать тренировку с эпохи №4.

Fast.ai использует для этого специальные функции обратного вызова. Чтобы узнать подробности того, как это делается, посмотрите здесь:

Как вы это кодируете?

Метод fit_one_cycle в fast.ai был разработан, чтобы вы могли определить, с какой части цикла следует возобновить прерванное обучение. Код для возобновления тренировки будет выглядеть так:

# Create a new net if training was interrupted and you had to 
# restart your Colab session
learn = cnn_learner(data, models.<your_model_here>, 
                    metrics=[accuracy, error_rate])
# If you're resuming, only indicating the epoch from which to 
# resume, indicated by start_epoch=<epoch#> will load the last 
# saved .pth, it is not necessary to explicitly reload the last 
# epoch, you only should NOT change the name given in 
# name=<callback_save_file>: when resuming fast.ai will try 
# to reload <callback_save_file>_<previous_epoch>.pth
# Unfreeze the network
learn.unfreeze()
# Use start_epoch=<some_epoch> to resume training...
learn.fit_one_cycle(20, max_lr=slice(1e-5,1e-6), 
                    start_epoch=<next_epoch#>,
                    callbacks=[SaveModelCallback(learn, 
                    every='epoch', monitor='accuracy', 
                    name=<callback_save_file>)])

… Fast.ai сообщит вам «Загружено ‹callback_save_file› _‹ previous_epoch # ›» и возобновит обучение.

Здесь вы можете посмотреть все параметры, поддерживаемые методом fit_one_cycle:

Как мне внедрить эту стратегию возобновления в мою Сеть?

Эта публикация посвящена тому, чтобы рассказать вам, как легко возобновить обучение в fast.ai, если его прервали. Если вы новичок в fast.ai, чтобы найти контекст и узнать, как интегрировать приведенный выше код во весь процесс обучения сети, ознакомьтесь с нашими публикациями в TowardsDataScience ниже:

Классификация изображений:

Семантическая сегментация:

Что мы узнали?

В этой публикации мы представили краткий обзор политики обучения сверхконвергенции fit1cycle, применяемой fast.ai, и представили несколько легко читаемых размещенных материалов, которые вы можете использовать, чтобы погрузиться глубже, если хотите, без необходимость читать научные статьи Лесли Н. Смит.

Мы также показали вам, как можно очень простым и практичным способом использовать несколько дополнительных параметров метода fit_one_cycle () из fast.ai для выполнения полностью прерываемых и возобновляемых циклов обучения.