|
|
- # 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 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'), # New variable shape.
- 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()
|