import numpy as np def worker_init_fn(worker_id): # This is apparently needed to ensure workers have different random seeds and draw different examples! np.random.seed(np.random.get_state()[1][0] + worker_id) def get_lr(optim): return optim.param_groups[0]["lr"] def set_lr(optim, lr): for g in optim.param_groups: g['lr'] = lr def set_cyclic_lr(optimizer, it, epoch_it, cycles, min_lr, max_lr): cycle_length = epoch_it // cycles curr_cycle = min(it // cycle_length, cycles-1) curr_it = it - cycle_length * curr_cycle new_lr = min_lr + 0.5*(max_lr - min_lr)*(1 + np.cos((float(curr_it) / float(cycle_length)) * np.pi)) set_lr(optimizer, new_lr)