详细解析三个训练调度文件:schedule_1x.py、schedule_2x.py、schedule_20e.py
在深度学习模型训练过程中,训练调度(Training Schedule)是至关重要的,它决定了模型训练过程中学习率(Learning Rate, LR)的变化以及训练的总轮数(Epochs)。本文将详细解析三个训练调度文件:schedule_1x.py
、schedule_2x.py
和schedule_20e.py
,这三个文件分别对应不同的训练时长和策略。
区别
这三个文件的主要区别在于训练的总轮数(max_epochs
)和学习率调度策略(param_scheduler
)中的milestones
参数。max_epochs
决定了训练的总轮数,而milestones
参数则定义了在哪些epoch时学习率会进行衰减。
schedule_1x.py
:训练总轮数为12轮,学习率在第8轮和第11轮时衰减。schedule_2x.py
:训练总轮数为24轮,学习率在第16轮和第22轮时衰减。schedule_20e.py
:训练总轮数为20轮,学习率在第16轮和第19轮时衰减。
schedule_1x.py 解析
python
# training schedule for 1x
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=12, val_interval=1)
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')
# learning rate
param_scheduler = [
dict(
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
dict(
type='MultiStepLR',
begin=0,
end=12,
by_epoch=True,
milestones=[8, 11],
gamma=0.1)
]
# optimizer
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001))
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=16)
训练配置(train_cfg
)
type
:'EpochBasedTrainLoop'
,表示训练循环是基于epoch的。max_epochs
:12
,训练的总轮数为12轮。val_interval
:1
,表示每1轮进行一次验证。
验证和测试配置(val_cfg
和 test_cfg
)
- 两者都设置为默认的循环配置。
学习率调度(param_scheduler
)
- 首先使用
LinearLR
,从0开始线性增加到start_factor=0.001
,直到end=500
迭代。 - 然后使用
MultiStepLR
,在第8轮和第11轮时,学习率乘以gamma=0.1
进行衰减。
优化器配置(optim_wrapper
)
- 使用
SGD
作为优化器,初始学习率为0.02
,动量为0.9
,权重衰减为0.0001
。
自动缩放学习率(auto_scale_lr
)
enable
:False
,表示不自动缩放学习率。base_batch_size
:16
,基础批量大小。
schedule_2x.py 解析
python
# training schedule for 2x
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=24, val_interval=1)
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')
# learning rate
param_scheduler = [
dict(
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
dict(
type='MultiStepLR',
begin=0,
end=24,
by_epoch=True,
milestones=[16, 22],
gamma=0.1)
]
# optimizer
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001))
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=16)
训练配置(train_cfg
)
max_epochs
:24
,训练的总轮数为24轮。
学习率调度(param_scheduler
)
- 使用
MultiStepLR
,在第16轮和第22轮时,学习率乘以gamma=0.1
进行衰减。
schedule_20e.py 解析
python
# training schedule for 20e
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=20, val_interval=1)
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')
# learning rate
param_scheduler = [
dict(
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
dict(
type='MultiStepLR',
begin=0,
end=20,
by_epoch=True,
milestones=[16, 19],
gamma=0.1)
]
# optimizer
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001))
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=16)
训练配置(train_cfg
)
max_epochs
:20
,训练的总轮数为20轮。
学习率调度(param_scheduler
)
- 使用
MultiStepLR
,在第16轮和第19轮时,学习率乘以gamma=0.1
进行衰减。
总结
这三个训练调度文件主要区别在于训练的总轮数和学习率衰减的时机。通过调整这些参数,可以控制模型的训练过程,以达到更好的训练效果。在实际应用中,根据模型的复杂度和训练数据的量,可以灵活选择或调整这些参数。