|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""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() |
|
|