| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Tests for object_detection.utils.learning_schedules.""" |
| import numpy as np |
| import tensorflow as tf |
|
|
| from object_detection.utils import learning_schedules |
| from object_detection.utils import test_case |
|
|
|
|
| class LearningSchedulesTest(test_case.TestCase): |
|
|
| def testExponentialDecayWithBurnin(self): |
| def graph_fn(global_step): |
| learning_rate_base = 1.0 |
| learning_rate_decay_steps = 3 |
| learning_rate_decay_factor = .1 |
| burnin_learning_rate = .5 |
| burnin_steps = 2 |
| min_learning_rate = .05 |
| learning_rate = learning_schedules.exponential_decay_with_burnin( |
| global_step, learning_rate_base, learning_rate_decay_steps, |
| learning_rate_decay_factor, burnin_learning_rate, burnin_steps, |
| min_learning_rate) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
|
|
| output_rates = [ |
| self.execute(graph_fn, [np.array(i).astype(np.int64)]) for i in range(9) |
| ] |
|
|
| exp_rates = [.5, .5, 1, 1, 1, .1, .1, .1, .05] |
| self.assertAllClose(output_rates, exp_rates, rtol=1e-4) |
|
|
| def testCosineDecayWithWarmup(self): |
| def graph_fn(global_step): |
| learning_rate_base = 1.0 |
| total_steps = 100 |
| warmup_learning_rate = 0.1 |
| warmup_steps = 9 |
| learning_rate = learning_schedules.cosine_decay_with_warmup( |
| global_step, learning_rate_base, total_steps, |
| warmup_learning_rate, warmup_steps) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
| exp_rates = [0.1, 0.5, 0.9, 1.0, 0] |
| input_global_steps = [0, 4, 8, 9, 100] |
| output_rates = [ |
| self.execute(graph_fn, [np.array(step).astype(np.int64)]) |
| for step in input_global_steps |
| ] |
| self.assertAllClose(output_rates, exp_rates) |
|
|
| def testCosineDecayAfterTotalSteps(self): |
| def graph_fn(global_step): |
| learning_rate_base = 1.0 |
| total_steps = 100 |
| warmup_learning_rate = 0.1 |
| warmup_steps = 9 |
| learning_rate = learning_schedules.cosine_decay_with_warmup( |
| global_step, learning_rate_base, total_steps, |
| warmup_learning_rate, warmup_steps) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
| exp_rates = [0] |
| input_global_steps = [101] |
| output_rates = [ |
| self.execute(graph_fn, [np.array(step).astype(np.int64)]) |
| for step in input_global_steps |
| ] |
| self.assertAllClose(output_rates, exp_rates) |
|
|
| def testCosineDecayWithHoldBaseLearningRateSteps(self): |
| def graph_fn(global_step): |
| learning_rate_base = 1.0 |
| total_steps = 120 |
| warmup_learning_rate = 0.1 |
| warmup_steps = 9 |
| hold_base_rate_steps = 20 |
| learning_rate = learning_schedules.cosine_decay_with_warmup( |
| global_step, learning_rate_base, total_steps, |
| warmup_learning_rate, warmup_steps, hold_base_rate_steps) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
| exp_rates = [0.1, 0.5, 0.9, 1.0, 1.0, 1.0, 0.999702, 0.874255, 0.577365, |
| 0.0] |
| input_global_steps = [0, 4, 8, 9, 10, 29, 30, 50, 70, 120] |
| output_rates = [ |
| self.execute(graph_fn, [np.array(step).astype(np.int64)]) |
| for step in input_global_steps |
| ] |
| self.assertAllClose(output_rates, exp_rates) |
|
|
| def testManualStepping(self): |
| def graph_fn(global_step): |
| boundaries = [2, 3, 7] |
| rates = [1.0, 2.0, 3.0, 4.0] |
| learning_rate = learning_schedules.manual_stepping( |
| global_step, boundaries, rates) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
|
|
| output_rates = [ |
| self.execute(graph_fn, [np.array(i).astype(np.int64)]) |
| for i in range(10) |
| ] |
| exp_rates = [1.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0] |
| self.assertAllClose(output_rates, exp_rates) |
|
|
| def testManualSteppingWithWarmup(self): |
| def graph_fn(global_step): |
| boundaries = [4, 6, 8] |
| rates = [0.02, 0.10, 0.01, 0.001] |
| learning_rate = learning_schedules.manual_stepping( |
| global_step, boundaries, rates, warmup=True) |
| assert learning_rate.op.name.endswith('learning_rate') |
| return (learning_rate,) |
|
|
| output_rates = [ |
| self.execute(graph_fn, [np.array(i).astype(np.int64)]) |
| for i in range(9) |
| ] |
| exp_rates = [0.02, 0.04, 0.06, 0.08, 0.10, 0.10, 0.01, 0.01, 0.001] |
| self.assertAllClose(output_rates, exp_rates) |
|
|
| def testManualSteppingWithZeroBoundaries(self): |
| def graph_fn(global_step): |
| boundaries = [] |
| rates = [0.01] |
| learning_rate = learning_schedules.manual_stepping( |
| global_step, boundaries, rates) |
| return (learning_rate,) |
|
|
| output_rates = [ |
| self.execute(graph_fn, [np.array(i).astype(np.int64)]) |
| for i in range(4) |
| ] |
| exp_rates = [0.01] * 4 |
| self.assertAllClose(output_rates, exp_rates) |
|
|
|
|
| if __name__ == '__main__': |
| tf.test.main() |
|
|