|
import cv2 |
|
from apex.optimizers import FusedAdam, FusedSGD |
|
from timm.optim import AdamW |
|
from torch import optim |
|
from torch.optim import lr_scheduler |
|
from torch.optim.rmsprop import RMSprop |
|
from torch.optim.adamw import AdamW |
|
from torch.optim.lr_scheduler import MultiStepLR, CyclicLR |
|
|
|
from training.tools.schedulers import ExponentialLRScheduler, PolyLR, LRStepScheduler |
|
|
|
cv2.ocl.setUseOpenCL(False) |
|
cv2.setNumThreads(0) |
|
|
|
|
|
class AverageMeter(object): |
|
"""Computes and stores the average and current value""" |
|
|
|
def __init__(self): |
|
self.reset() |
|
|
|
def reset(self): |
|
self.val = 0 |
|
self.avg = 0 |
|
self.sum = 0 |
|
self.count = 0 |
|
|
|
def update(self, val, n=1): |
|
self.val = val |
|
self.sum += val * n |
|
self.count += n |
|
self.avg = self.sum / self.count |
|
|
|
def create_optimizer(optimizer_config, model, master_params=None): |
|
"""Creates optimizer and schedule from configuration |
|
|
|
Parameters |
|
---------- |
|
optimizer_config : dict |
|
Dictionary containing the configuration options for the optimizer. |
|
model : Model |
|
The network model. |
|
|
|
Returns |
|
------- |
|
optimizer : Optimizer |
|
The optimizer. |
|
scheduler : LRScheduler |
|
The learning rate scheduler. |
|
""" |
|
if optimizer_config.get("classifier_lr", -1) != -1: |
|
|
|
net_params = [] |
|
classifier_params = [] |
|
for k, v in model.named_parameters(): |
|
if not v.requires_grad: |
|
continue |
|
if k.find("encoder") != -1: |
|
net_params.append(v) |
|
else: |
|
classifier_params.append(v) |
|
params = [ |
|
{"params": net_params}, |
|
{"params": classifier_params, "lr": optimizer_config["classifier_lr"]}, |
|
] |
|
else: |
|
if master_params: |
|
params = master_params |
|
else: |
|
params = model.parameters() |
|
|
|
if optimizer_config["type"] == "SGD": |
|
optimizer = optim.SGD(params, |
|
lr=optimizer_config["learning_rate"], |
|
momentum=optimizer_config["momentum"], |
|
weight_decay=optimizer_config["weight_decay"], |
|
nesterov=optimizer_config["nesterov"]) |
|
elif optimizer_config["type"] == "FusedSGD": |
|
optimizer = FusedSGD(params, |
|
lr=optimizer_config["learning_rate"], |
|
momentum=optimizer_config["momentum"], |
|
weight_decay=optimizer_config["weight_decay"], |
|
nesterov=optimizer_config["nesterov"]) |
|
elif optimizer_config["type"] == "Adam": |
|
optimizer = optim.Adam(params, |
|
lr=optimizer_config["learning_rate"], |
|
weight_decay=optimizer_config["weight_decay"]) |
|
elif optimizer_config["type"] == "FusedAdam": |
|
optimizer = FusedAdam(params, |
|
lr=optimizer_config["learning_rate"], |
|
weight_decay=optimizer_config["weight_decay"]) |
|
elif optimizer_config["type"] == "AdamW": |
|
optimizer = AdamW(params, |
|
lr=optimizer_config["learning_rate"], |
|
weight_decay=optimizer_config["weight_decay"]) |
|
elif optimizer_config["type"] == "RmsProp": |
|
optimizer = RMSprop(params, |
|
lr=optimizer_config["learning_rate"], |
|
weight_decay=optimizer_config["weight_decay"]) |
|
else: |
|
raise KeyError("unrecognized optimizer {}".format(optimizer_config["type"])) |
|
|
|
if optimizer_config["schedule"]["type"] == "step": |
|
scheduler = LRStepScheduler(optimizer, **optimizer_config["schedule"]["params"]) |
|
elif optimizer_config["schedule"]["type"] == "clr": |
|
scheduler = CyclicLR(optimizer, **optimizer_config["schedule"]["params"]) |
|
elif optimizer_config["schedule"]["type"] == "multistep": |
|
scheduler = MultiStepLR(optimizer, **optimizer_config["schedule"]["params"]) |
|
elif optimizer_config["schedule"]["type"] == "exponential": |
|
scheduler = ExponentialLRScheduler(optimizer, **optimizer_config["schedule"]["params"]) |
|
elif optimizer_config["schedule"]["type"] == "poly": |
|
scheduler = PolyLR(optimizer, **optimizer_config["schedule"]["params"]) |
|
elif optimizer_config["schedule"]["type"] == "constant": |
|
scheduler = lr_scheduler.LambdaLR(optimizer, lambda epoch: 1.0) |
|
elif optimizer_config["schedule"]["type"] == "linear": |
|
def linear_lr(it): |
|
return it * optimizer_config["schedule"]["params"]["alpha"] + optimizer_config["schedule"]["params"]["beta"] |
|
|
|
scheduler = lr_scheduler.LambdaLR(optimizer, linear_lr) |
|
|
|
return optimizer, scheduler |
|
|