Дополнительные настройки
Трюки, не реализованные оптимизатором, должны быть реализованы через конструктор оптимизатора (например, установка индивидуальных скоростей обучения) или хуки. Мы перечисляем некоторые общие настройки, которые могут стабилизировать обучение или ускорить его. Не стесняйтесь создавать PR или задавать вопросы для получения дополнительных настроек.
Используйте ограничение градиента для стабилизации обучения: Некоторым моделям требуется ограничение градиента, чтобы ограничить градиенты и стабилизировать процесс обучения. Пример:
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
Используйте расписание импульса для ускорения сходимости модели: Мы поддерживаем планировщик импульса, чтобы изменять импульс модели в соответствии со скоростью обучения, что может ускорить сходимость модели. Планировщик импульсов обычно используется с планировщиком LR, например, следующая конфигурация используется в 3D-детектировании для ускорения сходимости. Для получения дополнительной информации обратитесь к реализации CyclicLrUpdater и CyclicMomentumUpdater.
lr_config = dict(
policy='cyclic',
target_ratio=(10, 1e-4),
cyclic_times=1,
step_ratio_up=0.4,
)
momentum_config = dict(
policy='cyclic',
target_ratio=(0.85 / 0.95, 1),
cyclic_times=1,
step_ratio_up=0.4,
)
мы используем пошаговое расписание скорости обучения со значением по умолчанию в файлах конфигурации, это вызывает StepLRHook
в MMCV. Мы поддерживаем множество других расписаний скорости обучения здесь, таких как CosineAnnealing
и Poly
. Вот несколько примеров:
Расписание Poly:
lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)
Консинус-расписание Annealing:
lr_config = dict(
policy='CosineAnnealing',
warmup='linear',
warmup_iters=1000,
warmup_ratio=1.0 / 10,
min_lr_ratio=1e-5)
Рабочий процесс — это список (фаза, эпохи), определяющий порядок выполнения и количество эпох. По умолчанию он установлен на
workflow = [('train', 1)]
что означает выполнение 1 эпохи для обучения. Иногда пользователь может захотеть проверить некоторые показатели (например, потери, точность) модели на проверочном наборе. В этом случае мы можем установить рабочий процесс следующим образом:
[('train', 1), ('val', 1)]
так что 1 эпоха для обучения и 1 эпоха для проверки будут выполняться итеративно.
Примечание:
total_epochs
в конфигурации управляет только количеством тренировочных эпох и не влияет на рабочий процесс проверки.[('train', 1), ('val', 1)]
и [('train', 1)]
не изменят поведение EpochEvalHook
, потому что EpochEvalHook
вызывается after_train_epoch
, а рабочий процесс проверки влияет только на хуки, вызываемые через after_val_epoch
. Поэтому единственное различие между [('train', 1), ('val', 1)]
и [('train', 1)]
заключается в том, что бегун будет вычислять потери на проверочном наборе после каждой тренировочной эпохи.Здесь мы приводим пример создания нового хука в mmflow и использования его в обучении.
from mmcv.runner import HOOKS, Hook
@HOOKS.register_module()
class MyHook(Hook):
def __init__(self, a, b):
pass
def before_run(self, runner):
pass
def after_run(self, runner):
pass
def before_epoch(self, runner):
pass **В зависимости от функциональности хука, пользователи должны указать, что будет делать хук на каждом этапе обучения в before_run, after_run, before_epoch, after_epoch, before_iter и after_iter.**
**2. Зарегистрируйте новый хук.**
Затем нам нужно импортировать MyHook. Предполагая, что файл находится в mmflow/core/hooks/my_hook.py, есть два способа сделать это:
* Изменить mmflow/core/hooks/__init__.py для импорта.
Недавно определённый модуль должен быть импортирован в mmflow/core/hooks/__init__.py, чтобы реестр нашёл новый модуль и добавил его:
```python
from .my_hook import MyHook
custom_imports = dict(imports=['mmflow.core.hooks.my_hook'], allow_failed_imports=False)
3. Измените конфиг:
custom_hooks = [
dict(type='MyHook', a=a_value, b=b_value)
]
Также можно установить приоритет хука, добавив ключ priority к 'NORMAL' или 'HIGHEST', как показано ниже:
custom_hooks = [
dict(type='MyHook', a=a_value, b=b_value, priority='NORMAL')
]
По умолчанию приоритет хука устанавливается как NORMAL во время регистрации.
Если хук уже реализован в MMCV, вы можете напрямую изменить конфиг, чтобы использовать хук, как показано ниже:
mmcv_hooks = [
dict(type='MMCVHook', a=a_value, b=b_value, priority='NORMAL')
]
Существует несколько общих хуков, которые не зарегистрированы через custom_hooks, но были зарегистрированы по умолчанию при импорте MMCV. Это:
В этих хуках только логгер имеет приоритет VERY_LOW, у остальных — NORMAL.
Вышеупомянутые руководства уже охватывают, как модифицировать optimizer_config, momentum_config и lr_config. Здесь мы расскажем, что можно сделать с log_config, checkpoint_config и evaluation.
Бегун MMCV будет использовать checkpoint_config для инициализации CheckpointHook.
checkpoint_config = dict(interval=1)
Пользователи могут установить max_keep_ckpts для сохранения только небольшого количества чекпойнтов или решить, сохранять ли состояние оптимизатора с помощью save_optimizer. Более подробную информацию об аргументах можно найти здесь.
Log_config объединяет несколько логгеров и позволяет устанавливать интервалы. Теперь MMCV поддерживает WandbLoggerHook, MlflowLoggerHook и TensorboardLoggerHook. Подробное использование можно найти в документации.
log_config = dict(
interval=50,
hooks=[
dict(type='TextLoggerHook'),
dict(type='TensorboardLoggerHook')
])
Конфиг evaluation будет использоваться для инициализации EvalHook. За исключением ключа interval, другие аргументы, такие как metric, будут переданы в online_evaluation().
evaluation = dict(interval=50000, metric='EPE')
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )