# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ==============================================================================
|
|
|
|
"""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))
|
|
# TODO(rathodv): Find a way to not depend on the private members.
|
|
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()
|