|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Tests for object_detection.utils.variables_helper.""" |
|
import os |
|
|
|
import tensorflow as tf |
|
|
|
from object_detection.utils import variables_helper |
|
|
|
|
|
class FilterVariablesTest(tf.test.TestCase): |
|
|
|
def _create_variables(self): |
|
return [tf.Variable(1.0, name='FeatureExtractor/InceptionV3/weights'), |
|
tf.Variable(1.0, name='FeatureExtractor/InceptionV3/biases'), |
|
tf.Variable(1.0, name='StackProposalGenerator/weights'), |
|
tf.Variable(1.0, name='StackProposalGenerator/biases')] |
|
|
|
def test_return_all_variables_when_empty_regex(self): |
|
variables = self._create_variables() |
|
out_variables = variables_helper.filter_variables(variables, ['']) |
|
self.assertItemsEqual(out_variables, variables) |
|
|
|
def test_return_variables_which_do_not_match_single_regex(self): |
|
variables = self._create_variables() |
|
out_variables = variables_helper.filter_variables(variables, |
|
['FeatureExtractor/.*']) |
|
self.assertItemsEqual(out_variables, variables[2:]) |
|
|
|
def test_return_variables_which_do_not_match_any_regex_in_list(self): |
|
variables = self._create_variables() |
|
out_variables = variables_helper.filter_variables(variables, [ |
|
'FeatureExtractor.*biases', 'StackProposalGenerator.*biases' |
|
]) |
|
self.assertItemsEqual(out_variables, [variables[0], variables[2]]) |
|
|
|
def test_return_variables_matching_empty_regex_list(self): |
|
variables = self._create_variables() |
|
out_variables = variables_helper.filter_variables( |
|
variables, [''], invert=True) |
|
self.assertItemsEqual(out_variables, []) |
|
|
|
def test_return_variables_matching_some_regex_in_list(self): |
|
variables = self._create_variables() |
|
out_variables = variables_helper.filter_variables( |
|
variables, |
|
['FeatureExtractor.*biases', 'StackProposalGenerator.*biases'], |
|
invert=True) |
|
self.assertItemsEqual(out_variables, [variables[1], variables[3]]) |
|
|
|
|
|
class MultiplyGradientsMatchingRegexTest(tf.test.TestCase): |
|
|
|
def _create_grads_and_vars(self): |
|
return [(tf.constant(1.0), |
|
tf.Variable(1.0, name='FeatureExtractor/InceptionV3/weights')), |
|
(tf.constant(2.0), |
|
tf.Variable(2.0, name='FeatureExtractor/InceptionV3/biases')), |
|
(tf.constant(3.0), |
|
tf.Variable(3.0, name='StackProposalGenerator/weights')), |
|
(tf.constant(4.0), |
|
tf.Variable(4.0, name='StackProposalGenerator/biases'))] |
|
|
|
def test_multiply_all_feature_extractor_variables(self): |
|
grads_and_vars = self._create_grads_and_vars() |
|
regex_list = ['FeatureExtractor/.*'] |
|
multiplier = 0.0 |
|
grads_and_vars = variables_helper.multiply_gradients_matching_regex( |
|
grads_and_vars, regex_list, multiplier) |
|
exp_output = [(0.0, 1.0), (0.0, 2.0), (3.0, 3.0), (4.0, 4.0)] |
|
init_op = tf.global_variables_initializer() |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
output = sess.run(grads_and_vars) |
|
self.assertItemsEqual(output, exp_output) |
|
|
|
def test_multiply_all_bias_variables(self): |
|
grads_and_vars = self._create_grads_and_vars() |
|
regex_list = ['.*/biases'] |
|
multiplier = 0.0 |
|
grads_and_vars = variables_helper.multiply_gradients_matching_regex( |
|
grads_and_vars, regex_list, multiplier) |
|
exp_output = [(1.0, 1.0), (0.0, 2.0), (3.0, 3.0), (0.0, 4.0)] |
|
init_op = tf.global_variables_initializer() |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
output = sess.run(grads_and_vars) |
|
self.assertItemsEqual(output, exp_output) |
|
|
|
|
|
class FreezeGradientsMatchingRegexTest(tf.test.TestCase): |
|
|
|
def _create_grads_and_vars(self): |
|
return [(tf.constant(1.0), |
|
tf.Variable(1.0, name='FeatureExtractor/InceptionV3/weights')), |
|
(tf.constant(2.0), |
|
tf.Variable(2.0, name='FeatureExtractor/InceptionV3/biases')), |
|
(tf.constant(3.0), |
|
tf.Variable(3.0, name='StackProposalGenerator/weights')), |
|
(tf.constant(4.0), |
|
tf.Variable(4.0, name='StackProposalGenerator/biases'))] |
|
|
|
def test_freeze_all_feature_extractor_variables(self): |
|
grads_and_vars = self._create_grads_and_vars() |
|
regex_list = ['FeatureExtractor/.*'] |
|
grads_and_vars = variables_helper.freeze_gradients_matching_regex( |
|
grads_and_vars, regex_list) |
|
exp_output = [(3.0, 3.0), (4.0, 4.0)] |
|
init_op = tf.global_variables_initializer() |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
output = sess.run(grads_and_vars) |
|
self.assertItemsEqual(output, exp_output) |
|
|
|
|
|
class GetVariablesAvailableInCheckpointTest(tf.test.TestCase): |
|
|
|
def test_return_all_variables_from_checkpoint(self): |
|
with tf.Graph().as_default(): |
|
variables = [ |
|
tf.Variable(1.0, name='weights'), |
|
tf.Variable(1.0, name='biases') |
|
] |
|
checkpoint_path = os.path.join(self.get_temp_dir(), 'model.ckpt') |
|
init_op = tf.global_variables_initializer() |
|
saver = tf.train.Saver(variables) |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
saver.save(sess, checkpoint_path) |
|
out_variables = variables_helper.get_variables_available_in_checkpoint( |
|
variables, checkpoint_path) |
|
self.assertItemsEqual(out_variables, variables) |
|
|
|
def test_return_all_variables_from_checkpoint_with_partition(self): |
|
with tf.Graph().as_default(): |
|
partitioner = tf.fixed_size_partitioner(2) |
|
variables = [ |
|
tf.get_variable( |
|
name='weights', shape=(2, 2), partitioner=partitioner), |
|
tf.Variable([1.0, 2.0], name='biases') |
|
] |
|
checkpoint_path = os.path.join(self.get_temp_dir(), 'model.ckpt') |
|
init_op = tf.global_variables_initializer() |
|
saver = tf.train.Saver(variables) |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
saver.save(sess, checkpoint_path) |
|
out_variables = variables_helper.get_variables_available_in_checkpoint( |
|
variables, checkpoint_path) |
|
self.assertItemsEqual(out_variables, variables) |
|
|
|
def test_return_variables_available_in_checkpoint(self): |
|
checkpoint_path = os.path.join(self.get_temp_dir(), 'model.ckpt') |
|
with tf.Graph().as_default(): |
|
weight_variable = tf.Variable(1.0, name='weights') |
|
global_step = tf.train.get_or_create_global_step() |
|
graph1_variables = [ |
|
weight_variable, |
|
global_step |
|
] |
|
init_op = tf.global_variables_initializer() |
|
saver = tf.train.Saver(graph1_variables) |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
saver.save(sess, checkpoint_path) |
|
|
|
with tf.Graph().as_default(): |
|
graph2_variables = graph1_variables + [tf.Variable(1.0, name='biases')] |
|
out_variables = variables_helper.get_variables_available_in_checkpoint( |
|
graph2_variables, checkpoint_path, include_global_step=False) |
|
self.assertItemsEqual(out_variables, [weight_variable]) |
|
|
|
def test_return_variables_available_an_checkpoint_with_dict_inputs(self): |
|
checkpoint_path = os.path.join(self.get_temp_dir(), 'model.ckpt') |
|
with tf.Graph().as_default(): |
|
graph1_variables = [ |
|
tf.Variable(1.0, name='ckpt_weights'), |
|
] |
|
init_op = tf.global_variables_initializer() |
|
saver = tf.train.Saver(graph1_variables) |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
saver.save(sess, checkpoint_path) |
|
|
|
with tf.Graph().as_default(): |
|
graph2_variables_dict = { |
|
'ckpt_weights': tf.Variable(1.0, name='weights'), |
|
'ckpt_biases': tf.Variable(1.0, name='biases') |
|
} |
|
out_variables = variables_helper.get_variables_available_in_checkpoint( |
|
graph2_variables_dict, checkpoint_path) |
|
|
|
self.assertTrue(isinstance(out_variables, dict)) |
|
self.assertItemsEqual(out_variables.keys(), ['ckpt_weights']) |
|
self.assertTrue(out_variables['ckpt_weights'].op.name == 'weights') |
|
|
|
def test_return_variables_with_correct_sizes(self): |
|
checkpoint_path = os.path.join(self.get_temp_dir(), 'model.ckpt') |
|
with tf.Graph().as_default(): |
|
bias_variable = tf.Variable(3.0, name='biases') |
|
global_step = tf.train.get_or_create_global_step() |
|
graph1_variables = [ |
|
tf.Variable([[1.0, 2.0], [3.0, 4.0]], name='weights'), |
|
bias_variable, |
|
global_step |
|
] |
|
init_op = tf.global_variables_initializer() |
|
saver = tf.train.Saver(graph1_variables) |
|
with self.test_session() as sess: |
|
sess.run(init_op) |
|
saver.save(sess, checkpoint_path) |
|
|
|
with tf.Graph().as_default(): |
|
graph2_variables = [ |
|
tf.Variable([1.0, 2.0], name='weights'), |
|
bias_variable, |
|
global_step |
|
] |
|
|
|
out_variables = variables_helper.get_variables_available_in_checkpoint( |
|
graph2_variables, checkpoint_path, include_global_step=True) |
|
self.assertItemsEqual(out_variables, [bias_variable, global_step]) |
|
|
|
|
|
if __name__ == '__main__': |
|
tf.test.main() |
|
|