in scripts/imagenet/utils.py [0:0]
def create_optimizer(optimizer_config, model):
"""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["classifier_lr"] != -1:
# Separate classifier parameters from all others
net_params = []
classifier_params = []
for k, v in model.named_parameters():
if k.find("fc") != -1:
classifier_params.append(v)
else:
net_params.append(v)
params = [
{"params": net_params},
{"params": classifier_params, "lr": optimizer_config["classifier_lr"]},
]
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"] == "Adam":
optimizer = optim.Adam(
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 = lr_scheduler.StepLR(
optimizer, **optimizer_config["schedule"]["params"]
)
elif optimizer_config["schedule"]["type"] == "multistep":
scheduler = lr_scheduler.MultiStepLR(
optimizer, **optimizer_config["schedule"]["params"]
)
elif optimizer_config["schedule"]["type"] == "exponential":
scheduler = lr_scheduler.ExponentialLR(
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