lr.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import math
  2. from functools import partial
  3. import numpy as np
  4. from torch.optim import lr_scheduler
  5. class StepLR(object):
  6. def __init__(self,
  7. step_each_epoch,
  8. step_size,
  9. warmup_epoch=0,
  10. gamma=0.1,
  11. last_epoch=-1,
  12. **kwargs):
  13. super(StepLR, self).__init__()
  14. self.step_size = step_each_epoch * step_size
  15. self.gamma = gamma
  16. self.last_epoch = last_epoch
  17. self.warmup_epoch = warmup_epoch
  18. def __call__(self, optimizer):
  19. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  20. self.last_epoch)
  21. def lambda_func(self, current_step):
  22. if current_step < self.warmup_epoch:
  23. return float(current_step) / float(max(1, self.warmup_epoch))
  24. return self.gamma**(current_step // self.step_size)
  25. class MultiStepLR(object):
  26. def __init__(self,
  27. step_each_epoch,
  28. milestones,
  29. warmup_epoch=0,
  30. gamma=0.1,
  31. last_epoch=-1,
  32. **kwargs):
  33. super(MultiStepLR, self).__init__()
  34. self.milestones = [step_each_epoch * e for e in milestones]
  35. self.gamma = gamma
  36. self.last_epoch = last_epoch
  37. self.warmup_epoch = warmup_epoch
  38. def __call__(self, optimizer):
  39. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  40. self.last_epoch)
  41. def lambda_func(self, current_step):
  42. if current_step < self.warmup_epoch:
  43. return float(current_step) / float(max(1, self.warmup_epoch))
  44. return self.gamma**len(
  45. [m for m in self.milestones if m <= current_step])
  46. class ConstLR(object):
  47. def __init__(self,
  48. step_each_epoch,
  49. warmup_epoch=0,
  50. last_epoch=-1,
  51. **kwargs):
  52. super(ConstLR, self).__init__()
  53. self.last_epoch = last_epoch
  54. self.warmup_epoch = warmup_epoch * step_each_epoch
  55. def __call__(self, optimizer):
  56. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  57. self.last_epoch)
  58. def lambda_func(self, current_step):
  59. if current_step < self.warmup_epoch:
  60. return float(current_step) / float(max(1.0, self.warmup_epoch))
  61. return 1.0
  62. class LinearLR(object):
  63. def __init__(self,
  64. epochs,
  65. step_each_epoch,
  66. warmup_epoch=0,
  67. last_epoch=-1,
  68. **kwargs):
  69. super(LinearLR, self).__init__()
  70. self.epochs = epochs * step_each_epoch
  71. self.last_epoch = last_epoch
  72. self.warmup_epoch = warmup_epoch * step_each_epoch
  73. def __call__(self, optimizer):
  74. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  75. self.last_epoch)
  76. def lambda_func(self, current_step):
  77. if current_step < self.warmup_epoch:
  78. return float(current_step) / float(max(1, self.warmup_epoch))
  79. return max(
  80. 0.0,
  81. float(self.epochs - current_step) /
  82. float(max(1, self.epochs - self.warmup_epoch)),
  83. )
  84. class CosineAnnealingLR(object):
  85. def __init__(self,
  86. epochs,
  87. step_each_epoch,
  88. warmup_epoch=0,
  89. last_epoch=-1,
  90. **kwargs):
  91. super(CosineAnnealingLR, self).__init__()
  92. self.epochs = epochs * step_each_epoch
  93. self.last_epoch = last_epoch
  94. self.warmup_epoch = warmup_epoch * step_each_epoch
  95. def __call__(self, optimizer):
  96. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  97. self.last_epoch)
  98. def lambda_func(self, current_step, num_cycles=0.5):
  99. if current_step < self.warmup_epoch:
  100. return float(current_step) / float(max(1, self.warmup_epoch))
  101. progress = float(current_step - self.warmup_epoch) / float(
  102. max(1, self.epochs - self.warmup_epoch))
  103. return max(
  104. 0.0, 0.5 *
  105. (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)))
  106. class OneCycleLR(object):
  107. def __init__(self,
  108. epochs,
  109. step_each_epoch,
  110. last_epoch=-1,
  111. lr=0.00148,
  112. warmup_epoch=1.0,
  113. cycle_momentum=True,
  114. **kwargs):
  115. super(OneCycleLR, self).__init__()
  116. self.epochs = epochs
  117. self.last_epoch = last_epoch
  118. self.step_each_epoch = step_each_epoch
  119. self.lr = lr
  120. self.pct_start = warmup_epoch / epochs
  121. self.cycle_momentum = cycle_momentum
  122. def __call__(self, optimizer):
  123. return lr_scheduler.OneCycleLR(
  124. optimizer,
  125. max_lr=self.lr,
  126. total_steps=self.epochs * self.step_each_epoch,
  127. pct_start=self.pct_start,
  128. cycle_momentum=self.cycle_momentum,
  129. )
  130. class PolynomialLR(object):
  131. def __init__(self,
  132. step_each_epoch,
  133. epochs,
  134. lr_end=1e-7,
  135. power=1.0,
  136. warmup_epoch=0,
  137. last_epoch=-1,
  138. **kwargs):
  139. super(PolynomialLR, self).__init__()
  140. self.lr_end = lr_end
  141. self.power = power
  142. self.epochs = epochs * step_each_epoch
  143. self.warmup_epoch = warmup_epoch * step_each_epoch
  144. self.last_epoch = last_epoch
  145. def __call__(self, optimizer):
  146. lr_lambda = partial(
  147. self.lambda_func,
  148. lr_init=optimizer.defaults['lr'],
  149. )
  150. return lr_scheduler.LambdaLR(optimizer, lr_lambda, self.last_epoch)
  151. def lambda_func(self, current_step, lr_init):
  152. if current_step < self.warmup_epoch:
  153. return float(current_step) / float(max(1, self.warmup_epoch))
  154. elif current_step > self.epochs:
  155. return self.lr_end / lr_init # as LambdaLR multiplies by lr_init
  156. else:
  157. lr_range = lr_init - self.lr_end
  158. decay_steps = self.epochs - self.warmup_epoch
  159. pct_remaining = 1 - (current_step -
  160. self.warmup_epoch) / decay_steps
  161. decay = lr_range * pct_remaining**self.power + self.lr_end
  162. return decay / lr_init # as LambdaLR multiplies by lr_init
  163. class CdistNetLR(object):
  164. def __init__(self,
  165. step_each_epoch,
  166. lr=0.0442,
  167. n_warmup_steps=10000,
  168. step2_epoch=7,
  169. last_epoch=-1,
  170. **kwargs):
  171. super(CdistNetLR, self).__init__()
  172. self.last_epoch = last_epoch
  173. self.step2_epoch = step2_epoch * step_each_epoch
  174. self.n_current_steps = 0
  175. self.n_warmup_steps = n_warmup_steps
  176. self.init_lr = lr
  177. self.step2_lr = 0.00001
  178. def __call__(self, optimizer):
  179. return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
  180. self.last_epoch)
  181. def lambda_func(self, current_step):
  182. if current_step < self.step2_epoch:
  183. return np.min([
  184. np.power(current_step, -0.5),
  185. np.power(self.n_warmup_steps, -1.5) * current_step,
  186. ])
  187. return self.step2_lr / self.init_lr