| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Tests for optimizer_builder.""" |
|
|
| import tensorflow as tf |
|
|
| from google.protobuf import text_format |
|
|
| from object_detection.builders import optimizer_builder |
| from object_detection.protos import optimizer_pb2 |
|
|
|
|
| class LearningRateBuilderTest(tf.test.TestCase): |
|
|
| def testBuildConstantLearningRate(self): |
| learning_rate_text_proto = """ |
| constant_learning_rate { |
| learning_rate: 0.004 |
| } |
| """ |
| learning_rate_proto = optimizer_pb2.LearningRate() |
| text_format.Merge(learning_rate_text_proto, learning_rate_proto) |
| learning_rate = optimizer_builder._create_learning_rate( |
| learning_rate_proto) |
| self.assertTrue(learning_rate.op.name.endswith('learning_rate')) |
| with self.test_session(): |
| learning_rate_out = learning_rate.eval() |
| self.assertAlmostEqual(learning_rate_out, 0.004) |
|
|
| def testBuildExponentialDecayLearningRate(self): |
| learning_rate_text_proto = """ |
| exponential_decay_learning_rate { |
| initial_learning_rate: 0.004 |
| decay_steps: 99999 |
| decay_factor: 0.85 |
| staircase: false |
| } |
| """ |
| learning_rate_proto = optimizer_pb2.LearningRate() |
| text_format.Merge(learning_rate_text_proto, learning_rate_proto) |
| learning_rate = optimizer_builder._create_learning_rate( |
| learning_rate_proto) |
| self.assertTrue(learning_rate.op.name.endswith('learning_rate')) |
| self.assertTrue(isinstance(learning_rate, tf.Tensor)) |
|
|
| def testBuildManualStepLearningRate(self): |
| learning_rate_text_proto = """ |
| manual_step_learning_rate { |
| initial_learning_rate: 0.002 |
| schedule { |
| step: 100 |
| learning_rate: 0.006 |
| } |
| schedule { |
| step: 90000 |
| learning_rate: 0.00006 |
| } |
| warmup: true |
| } |
| """ |
| learning_rate_proto = optimizer_pb2.LearningRate() |
| text_format.Merge(learning_rate_text_proto, learning_rate_proto) |
| learning_rate = optimizer_builder._create_learning_rate( |
| learning_rate_proto) |
| self.assertTrue(isinstance(learning_rate, tf.Tensor)) |
|
|
| def testBuildCosineDecayLearningRate(self): |
| learning_rate_text_proto = """ |
| cosine_decay_learning_rate { |
| learning_rate_base: 0.002 |
| total_steps: 20000 |
| warmup_learning_rate: 0.0001 |
| warmup_steps: 1000 |
| hold_base_rate_steps: 20000 |
| } |
| """ |
| learning_rate_proto = optimizer_pb2.LearningRate() |
| text_format.Merge(learning_rate_text_proto, learning_rate_proto) |
| learning_rate = optimizer_builder._create_learning_rate( |
| learning_rate_proto) |
| self.assertTrue(isinstance(learning_rate, tf.Tensor)) |
|
|
| def testRaiseErrorOnEmptyLearningRate(self): |
| learning_rate_text_proto = """ |
| """ |
| learning_rate_proto = optimizer_pb2.LearningRate() |
| text_format.Merge(learning_rate_text_proto, learning_rate_proto) |
| with self.assertRaises(ValueError): |
| optimizer_builder._create_learning_rate(learning_rate_proto) |
|
|
|
|
| class OptimizerBuilderTest(tf.test.TestCase): |
|
|
| def testBuildRMSPropOptimizer(self): |
| optimizer_text_proto = """ |
| rms_prop_optimizer: { |
| learning_rate: { |
| exponential_decay_learning_rate { |
| initial_learning_rate: 0.004 |
| decay_steps: 800720 |
| decay_factor: 0.95 |
| } |
| } |
| momentum_optimizer_value: 0.9 |
| decay: 0.9 |
| epsilon: 1.0 |
| } |
| use_moving_average: false |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| optimizer, _ = optimizer_builder.build(optimizer_proto) |
| self.assertTrue(isinstance(optimizer, tf.train.RMSPropOptimizer)) |
|
|
| def testBuildMomentumOptimizer(self): |
| optimizer_text_proto = """ |
| momentum_optimizer: { |
| learning_rate: { |
| constant_learning_rate { |
| learning_rate: 0.001 |
| } |
| } |
| momentum_optimizer_value: 0.99 |
| } |
| use_moving_average: false |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| optimizer, _ = optimizer_builder.build(optimizer_proto) |
| self.assertTrue(isinstance(optimizer, tf.train.MomentumOptimizer)) |
|
|
| def testBuildAdamOptimizer(self): |
| optimizer_text_proto = """ |
| adam_optimizer: { |
| learning_rate: { |
| constant_learning_rate { |
| learning_rate: 0.002 |
| } |
| } |
| } |
| use_moving_average: false |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| optimizer, _ = optimizer_builder.build(optimizer_proto) |
| self.assertTrue(isinstance(optimizer, tf.train.AdamOptimizer)) |
|
|
| def testBuildMovingAverageOptimizer(self): |
| optimizer_text_proto = """ |
| adam_optimizer: { |
| learning_rate: { |
| constant_learning_rate { |
| learning_rate: 0.002 |
| } |
| } |
| } |
| use_moving_average: True |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| optimizer, _ = optimizer_builder.build(optimizer_proto) |
| self.assertTrue( |
| isinstance(optimizer, tf.contrib.opt.MovingAverageOptimizer)) |
|
|
| def testBuildMovingAverageOptimizerWithNonDefaultDecay(self): |
| optimizer_text_proto = """ |
| adam_optimizer: { |
| learning_rate: { |
| constant_learning_rate { |
| learning_rate: 0.002 |
| } |
| } |
| } |
| use_moving_average: True |
| moving_average_decay: 0.2 |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| optimizer, _ = optimizer_builder.build(optimizer_proto) |
| self.assertTrue( |
| isinstance(optimizer, tf.contrib.opt.MovingAverageOptimizer)) |
| |
| self.assertAlmostEqual(optimizer._ema._decay, 0.2) |
|
|
| def testBuildEmptyOptimizer(self): |
| optimizer_text_proto = """ |
| """ |
| optimizer_proto = optimizer_pb2.Optimizer() |
| text_format.Merge(optimizer_text_proto, optimizer_proto) |
| with self.assertRaises(ValueError): |
| optimizer_builder.build(optimizer_proto) |
|
|
|
|
| if __name__ == '__main__': |
| tf.test.main() |
|
|