parent
716f6bfdd8
commit
a4a65ffe06
@ -1,21 +0,0 @@
|
|||||||
# Copyright 2020 Huawei Technologies Co., Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
# ============================================================================
|
|
||||||
"""
|
|
||||||
linear warm up learning rate.
|
|
||||||
"""
|
|
||||||
def linear_warmup_lr(current_step, warmup_steps, base_lr, init_lr):
|
|
||||||
lr_inc = (float(base_lr) - float(init_lr)) / float(warmup_steps)
|
|
||||||
lr = float(init_lr) + lr_inc * current_step
|
|
||||||
return lr
|
|
@ -0,0 +1,142 @@
|
|||||||
|
# Copyright 2020 Huawei Technologies Co., Ltd
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
# ============================================================================
|
||||||
|
"""
|
||||||
|
learning rate generator.
|
||||||
|
"""
|
||||||
|
import math
|
||||||
|
from collections import Counter
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
def linear_warmup_lr(current_step, warmup_steps, base_lr, init_lr):
|
||||||
|
"""
|
||||||
|
Applies liner Increasing to generate learning rate array in warmup stage.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
current_step(int): current step in warmup stage.
|
||||||
|
warmup_steps(int): all steps in warmup stage.
|
||||||
|
base_lr(float): init learning rate.
|
||||||
|
init_lr(float): end learning rate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
float, learning rate.
|
||||||
|
"""
|
||||||
|
lr_inc = (float(base_lr) - float(init_lr)) / float(warmup_steps)
|
||||||
|
lr = float(init_lr) + lr_inc * current_step
|
||||||
|
return lr
|
||||||
|
|
||||||
|
|
||||||
|
def warmup_cosine_annealing_lr(lr, steps_per_epoch, warmup_epochs, max_epoch, T_max, eta_min=0):
|
||||||
|
"""
|
||||||
|
Applies cosine decay to generate learning rate array with warmup.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
lr(float): init learning rate
|
||||||
|
steps_per_epoch(int): steps of one epoch
|
||||||
|
warmup_epochs(int): number of warmup epochs
|
||||||
|
max_epoch(int): total epoch of training
|
||||||
|
T_max(int): max epoch in decay.
|
||||||
|
eta_min(float): end learning rate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
np.array, learning rate array.
|
||||||
|
"""
|
||||||
|
base_lr = lr
|
||||||
|
warmup_init_lr = 0
|
||||||
|
total_steps = int(max_epoch * steps_per_epoch)
|
||||||
|
warmup_steps = int(warmup_epochs * steps_per_epoch)
|
||||||
|
|
||||||
|
lr_each_step = []
|
||||||
|
for i in range(total_steps):
|
||||||
|
last_epoch = i // steps_per_epoch
|
||||||
|
if i < warmup_steps:
|
||||||
|
lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr)
|
||||||
|
else:
|
||||||
|
lr = eta_min + (base_lr - eta_min) * (1. + math.cos(math.pi * last_epoch / T_max)) / 2
|
||||||
|
lr_each_step.append(lr)
|
||||||
|
|
||||||
|
return np.array(lr_each_step).astype(np.float32)
|
||||||
|
|
||||||
|
|
||||||
|
def warmup_step_lr(lr, lr_epochs, steps_per_epoch, warmup_epochs, max_epoch, gamma=0.1):
|
||||||
|
"""
|
||||||
|
Applies step decay to generate learning rate array with warmup.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
lr(float): init learning rate
|
||||||
|
lr_epochs(list): learning rate decay epoches list
|
||||||
|
steps_per_epoch(int): steps of one epoch
|
||||||
|
warmup_epochs(int): number of warmup epochs
|
||||||
|
max_epoch(int): total epoch of training
|
||||||
|
gamma(float): attenuation constants.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
np.array, learning rate array.
|
||||||
|
"""
|
||||||
|
base_lr = lr
|
||||||
|
warmup_init_lr = 0
|
||||||
|
total_steps = int(max_epoch * steps_per_epoch)
|
||||||
|
warmup_steps = int(warmup_epochs * steps_per_epoch)
|
||||||
|
milestones = lr_epochs
|
||||||
|
milestones_steps = []
|
||||||
|
for milestone in milestones:
|
||||||
|
milestones_step = milestone * steps_per_epoch
|
||||||
|
milestones_steps.append(milestones_step)
|
||||||
|
|
||||||
|
lr_each_step = []
|
||||||
|
lr = base_lr
|
||||||
|
milestones_steps_counter = Counter(milestones_steps)
|
||||||
|
for i in range(total_steps):
|
||||||
|
if i < warmup_steps:
|
||||||
|
lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr)
|
||||||
|
else:
|
||||||
|
lr = lr * gamma**milestones_steps_counter[i]
|
||||||
|
lr_each_step.append(lr)
|
||||||
|
|
||||||
|
return np.array(lr_each_step).astype(np.float32)
|
||||||
|
|
||||||
|
|
||||||
|
def multi_step_lr(lr, milestones, steps_per_epoch, max_epoch, gamma=0.1):
|
||||||
|
return warmup_step_lr(lr, milestones, steps_per_epoch, 0, max_epoch, gamma=gamma)
|
||||||
|
|
||||||
|
|
||||||
|
def step_lr(lr, epoch_size, steps_per_epoch, max_epoch, gamma=0.1):
|
||||||
|
lr_epochs = []
|
||||||
|
for i in range(1, max_epoch):
|
||||||
|
if i % epoch_size == 0:
|
||||||
|
lr_epochs.append(i)
|
||||||
|
return multi_step_lr(lr, lr_epochs, steps_per_epoch, max_epoch, gamma=gamma)
|
||||||
|
|
||||||
|
|
||||||
|
def get_lr(args):
|
||||||
|
"""generate learning rate array."""
|
||||||
|
if args.lr_scheduler == 'exponential':
|
||||||
|
lr = warmup_step_lr(args.lr,
|
||||||
|
args.lr_epochs,
|
||||||
|
args.steps_per_epoch,
|
||||||
|
args.warmup_epochs,
|
||||||
|
args.max_epoch,
|
||||||
|
gamma=args.lr_gamma,
|
||||||
|
)
|
||||||
|
elif args.lr_scheduler == 'cosine_annealing':
|
||||||
|
lr = warmup_cosine_annealing_lr(args.lr,
|
||||||
|
args.steps_per_epoch,
|
||||||
|
args.warmup_epochs,
|
||||||
|
args.max_epoch,
|
||||||
|
args.T_max,
|
||||||
|
args.eta_min)
|
||||||
|
else:
|
||||||
|
raise NotImplementedError(args.lr_scheduler)
|
||||||
|
return lr
|
@ -1,40 +0,0 @@
|
|||||||
# Copyright 2020 Huawei Technologies Co., Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
# ============================================================================
|
|
||||||
"""
|
|
||||||
warm up cosine annealing learning rate.
|
|
||||||
"""
|
|
||||||
import math
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from .linear_warmup import linear_warmup_lr
|
|
||||||
|
|
||||||
|
|
||||||
def warmup_cosine_annealing_lr(lr, steps_per_epoch, warmup_epochs, max_epoch, T_max, eta_min=0):
|
|
||||||
"""warm up cosine annealing learning rate."""
|
|
||||||
base_lr = lr
|
|
||||||
warmup_init_lr = 0
|
|
||||||
total_steps = int(max_epoch * steps_per_epoch)
|
|
||||||
warmup_steps = int(warmup_epochs * steps_per_epoch)
|
|
||||||
|
|
||||||
lr_each_step = []
|
|
||||||
for i in range(total_steps):
|
|
||||||
last_epoch = i // steps_per_epoch
|
|
||||||
if i < warmup_steps:
|
|
||||||
lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr)
|
|
||||||
else:
|
|
||||||
lr = eta_min + (base_lr - eta_min) * (1. + math.cos(math.pi*last_epoch / T_max)) / 2
|
|
||||||
lr_each_step.append(lr)
|
|
||||||
|
|
||||||
return np.array(lr_each_step).astype(np.float32)
|
|
@ -1,56 +0,0 @@
|
|||||||
# Copyright 2020 Huawei Technologies Co., Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
# ============================================================================
|
|
||||||
"""
|
|
||||||
warm up step learning rate.
|
|
||||||
"""
|
|
||||||
from collections import Counter
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from .linear_warmup import linear_warmup_lr
|
|
||||||
|
|
||||||
|
|
||||||
def warmup_step_lr(lr, lr_epochs, steps_per_epoch, warmup_epochs, max_epoch, gamma=0.1):
|
|
||||||
"""warmup_step_lr"""
|
|
||||||
base_lr = lr
|
|
||||||
warmup_init_lr = 0
|
|
||||||
total_steps = int(max_epoch * steps_per_epoch)
|
|
||||||
warmup_steps = int(warmup_epochs * steps_per_epoch)
|
|
||||||
milestones = lr_epochs
|
|
||||||
milestones_steps = []
|
|
||||||
for milestone in milestones:
|
|
||||||
milestones_step = milestone * steps_per_epoch
|
|
||||||
milestones_steps.append(milestones_step)
|
|
||||||
|
|
||||||
lr_each_step = []
|
|
||||||
lr = base_lr
|
|
||||||
milestones_steps_counter = Counter(milestones_steps)
|
|
||||||
for i in range(total_steps):
|
|
||||||
if i < warmup_steps:
|
|
||||||
lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr)
|
|
||||||
else:
|
|
||||||
lr = lr * gamma**milestones_steps_counter[i]
|
|
||||||
lr_each_step.append(lr)
|
|
||||||
|
|
||||||
return np.array(lr_each_step).astype(np.float32)
|
|
||||||
|
|
||||||
def multi_step_lr(lr, milestones, steps_per_epoch, max_epoch, gamma=0.1):
|
|
||||||
return warmup_step_lr(lr, milestones, steps_per_epoch, 0, max_epoch, gamma=gamma)
|
|
||||||
|
|
||||||
def step_lr(lr, epoch_size, steps_per_epoch, max_epoch, gamma=0.1):
|
|
||||||
lr_epochs = []
|
|
||||||
for i in range(1, max_epoch):
|
|
||||||
if i % epoch_size == 0:
|
|
||||||
lr_epochs.append(i)
|
|
||||||
return multi_step_lr(lr, lr_epochs, steps_per_epoch, max_epoch, gamma=gamma)
|
|
Loading…
Reference in new issue