Transfer learning on TensorFlow-Slim image classification model library
# Copyright 2019 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 google3.third_party.tensorflow_models.slim.nets.mobilenet.mobilenet_v3."""from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport tensorflow.compat.v1 as tffrom nets.mobilenet import mobilenet_v3from google3.testing.pybase import parameterizedclass MobilenetV3Test(tf.test.TestCase, parameterized.TestCase): # pylint: disable = g-unreachable-test-method def assertVariablesHaveNormalizerFn(self, use_groupnorm): global_variables = [v.name for v in tf.global_variables()] has_batch_norm = False has_group_norm = False for global_variable in global_variables: if 'BatchNorm' in global_variable: has_batch_norm = True if 'GroupNorm' in global_variable: has_group_norm = True if use_groupnorm: self.assertFalse(has_batch_norm) self.assertTrue(has_group_norm) else: self.assertTrue(has_batch_norm) self.assertFalse(has_group_norm) @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetV3Large(self, use_groupnorm): logits, endpoints = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (1, 224, 224, 3)), use_groupnorm=use_groupnorm) self.assertEqual(endpoints['layer_19'].shape, [1, 1, 1, 1280]) self.assertEqual(logits.shape, [1, 1001]) self.assertVariablesHaveNormalizerFn(use_groupnorm) @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetV3Small(self, use_groupnorm): _, endpoints = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (1, 224, 224, 3)), conv_defs=mobilenet_v3.V3_SMALL, use_groupnorm=use_groupnorm) self.assertEqual(endpoints['layer_15'].shape, [1, 1, 1, 1024]) self.assertVariablesHaveNormalizerFn(use_groupnorm) @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetEdgeTpu(self, use_groupnorm): _, endpoints = mobilenet_v3.edge_tpu( tf.placeholder(tf.float32, (1, 224, 224, 3)), use_groupnorm=use_groupnorm) self.assertIn('Inference mode is created by default', mobilenet_v3.edge_tpu.__doc__) self.assertEqual(endpoints['layer_24'].shape, [1, 7, 7, 1280]) self.assertStartsWith( endpoints['layer_24'].name, 'MobilenetEdgeTPU') self.assertVariablesHaveNormalizerFn(use_groupnorm) def testMobilenetEdgeTpuChangeScope(self): _, endpoints = mobilenet_v3.edge_tpu( tf.placeholder(tf.float32, (1, 224, 224, 3)), scope='Scope') self.assertStartsWith( endpoints['layer_24'].name, 'Scope') @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetV3BaseOnly(self, use_groupnorm): result, endpoints = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (1, 224, 224, 3)), conv_defs=mobilenet_v3.V3_LARGE, use_groupnorm=use_groupnorm, base_only=True, final_endpoint='layer_17') # Get the latest layer before average pool. self.assertEqual(endpoints['layer_17'].shape, [1, 7, 7, 960]) self.assertEqual(result, endpoints['layer_17']) self.assertVariablesHaveNormalizerFn(use_groupnorm) def testMobilenetV3BaseOnly_VariableInput(self): result, endpoints = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (None, None, None, 3)), conv_defs=mobilenet_v3.V3_LARGE, base_only=True, final_endpoint='layer_17') # Get the latest layer before average pool. self.assertEqual(endpoints['layer_17'].shape.as_list(), [None, None, None, 960]) self.assertEqual(result, endpoints['layer_17']) # Use reduce mean for pooling and check for operation 'ReduceMean' in graph @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetV3WithReduceMean(self, use_groupnorm): _, _ = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (1, 224, 224, 3)), conv_defs=mobilenet_v3.V3_SMALL, use_groupnorm=use_groupnorm, use_reduce_mean_for_pooling=True) g = tf.get_default_graph() reduce_mean = [v for v in g.get_operations() if 'ReduceMean' in v.name] self.assertNotEmpty(reduce_mean) self.assertVariablesHaveNormalizerFn(use_groupnorm) @parameterized.named_parameters(('without_groupnorm', False), ('with_groupnorm', True)) def testMobilenetV3WithOutReduceMean(self, use_groupnorm): _, _ = mobilenet_v3.mobilenet( tf.placeholder(tf.float32, (1, 224, 224, 3)), conv_defs=mobilenet_v3.V3_SMALL, use_groupnorm=use_groupnorm, use_reduce_mean_for_pooling=False) g = tf.get_default_graph() reduce_mean = [v for v in g.get_operations() if 'ReduceMean' in v.name] self.assertEmpty(reduce_mean) self.assertVariablesHaveNormalizerFn(use_groupnorm)if __name__ == '__main__': # absltest.main() tf.test.main()