def testEndpointsReuse(self): inputs = create_test_input(2, 32, 32, 3) with slim.arg_scope(xception.xception_arg_scope()): _, end_points0 = xception.xception_65(inputs, num_classes=10, reuse=False) with slim.arg_scope(xception.xception_arg_scope()): _, end_points1 = xception.xception_65(inputs, num_classes=10, reuse=True) self.assertItemsEqual(end_points0.keys(), end_points1.keys())
def testAtrousFullyConvolutionalValues(self): """Verify dense feature extraction with atrous convolution.""" nominal_stride = 32 for output_stride in [4, 8, 16, 32, None]: with slim.arg_scope(xception.xception_arg_scope()): with tf.Graph().as_default(): with self.test_session() as sess: tf.set_random_seed(0) inputs = create_test_input(2, 96, 97, 3) # Dense feature extraction followed by subsampling. output, _ = self._xception_small( inputs, None, is_training=False, global_pool=False, output_stride=output_stride) if output_stride is None: factor = 1 else: factor = nominal_stride // output_stride output = resnet_utils.subsample(output, factor) # Make the two networks use the same weights. tf.get_variable_scope().reuse_variables() # Feature extraction at the nominal network rate. expected, _ = self._xception_small(inputs, None, is_training=False, global_pool=False) sess.run(tf.global_variables_initializer()) self.assertAllClose(output.eval(), expected.eval(), atol=1e-5, rtol=1e-5)
def testFullyConvolutionalUnknownHeightWidth(self): batch = 2 height, width = 65, 65 global_pool = False inputs = create_test_input(batch, None, None, 3) with slim.arg_scope(xception.xception_arg_scope()): output, _ = self._xception_small(inputs, None, global_pool=global_pool) self.assertListEqual(output.get_shape().as_list(), [batch, None, None, 16]) images = create_test_input(batch, height, width, 3) with self.test_session() as sess: sess.run(tf.global_variables_initializer()) output = sess.run(output, {inputs: images.eval()}) self.assertEquals(output.shape, (batch, 3, 3, 16))
def testClassificationEndPoints(self): global_pool = True num_classes = 10 inputs = create_test_input(2, 224, 224, 3) with slim.arg_scope(xception.xception_arg_scope()): logits, end_points = self._xception_small(inputs, num_classes=num_classes, global_pool=global_pool, scope='xception') self.assertTrue(logits.op.name.startswith('xception/logits')) self.assertListEqual(logits.get_shape().as_list(), [2, 1, 1, num_classes]) self.assertTrue('predictions' in end_points) self.assertListEqual(end_points['predictions'].get_shape().as_list(), [2, 1, 1, num_classes]) self.assertTrue('global_pool' in end_points) self.assertListEqual(end_points['global_pool'].get_shape().as_list(), [2, 1, 1, 16])
def testUnknownBatchSize(self): batch = 2 height, width = 65, 65 global_pool = True num_classes = 10 inputs = create_test_input(None, height, width, 3) with slim.arg_scope(xception.xception_arg_scope()): logits, _ = self._xception_small(inputs, num_classes, global_pool=global_pool, scope='xception') self.assertTrue(logits.op.name.startswith('xception/logits')) self.assertListEqual(logits.get_shape().as_list(), [None, 1, 1, num_classes]) images = create_test_input(batch, height, width, 3) with self.test_session() as sess: sess.run(tf.global_variables_initializer()) output = sess.run(logits, {inputs: images.eval()}) self.assertEquals(output.shape, (batch, 1, 1, num_classes))
def testFullyConvolutionalEndpointShapes(self): global_pool = False num_classes = 10 inputs = create_test_input(2, 321, 321, 3) with slim.arg_scope(xception.xception_arg_scope()): _, end_points = self._xception_small(inputs, num_classes, global_pool=global_pool, scope='xception') endpoint_to_shape = { 'xception/entry_flow/conv1_1': [2, 161, 161, 32], 'xception/entry_flow/block1': [2, 81, 81, 1], 'xception/entry_flow/block2': [2, 41, 41, 2], 'xception/entry_flow/block4': [2, 21, 21, 4], 'xception/middle_flow/block1': [2, 21, 21, 4], 'xception/exit_flow/block1': [2, 11, 11, 8], 'xception/exit_flow/block2': [2, 11, 11, 16] } for endpoint, shape in endpoint_to_shape.iteritems(): self.assertListEqual( end_points[endpoint].get_shape().as_list(), shape)
def testClassificationShapes(self): global_pool = True num_classes = 10 inputs = create_test_input(2, 224, 224, 3) with slim.arg_scope(xception.xception_arg_scope()): _, end_points = self._xception_small(inputs, num_classes, global_pool=global_pool, scope='xception') endpoint_to_shape = { 'xception/entry_flow/conv1_1': [2, 112, 112, 32], 'xception/entry_flow/block1': [2, 56, 56, 1], 'xception/entry_flow/block2': [2, 28, 28, 2], 'xception/entry_flow/block4': [2, 14, 14, 4], 'xception/middle_flow/block1': [2, 14, 14, 4], 'xception/exit_flow/block1': [2, 7, 7, 8], 'xception/exit_flow/block2': [2, 7, 7, 16] } for endpoint, shape in endpoint_to_shape.iteritems(): self.assertListEqual( end_points[endpoint].get_shape().as_list(), shape)
def testEndpointNames(self): global_pool = True num_classes = 10 inputs = create_test_input(2, 224, 224, 3) with slim.arg_scope(xception.xception_arg_scope()): _, end_points = self._xception_small(inputs, num_classes=num_classes, global_pool=global_pool, scope='xception') expected = [ 'xception/entry_flow/conv1_1', 'xception/entry_flow/conv1_2', 'xception/entry_flow/block1/unit_1/xception_module/separable_conv1', 'xception/entry_flow/block1/unit_1/xception_module/separable_conv2', 'xception/entry_flow/block1/unit_1/xception_module/separable_conv3', 'xception/entry_flow/block1/unit_1/xception_module/shortcut', 'xception/entry_flow/block1/unit_1/xception_module', 'xception/entry_flow/block1', 'xception/entry_flow/block2/unit_1/xception_module/separable_conv1', 'xception/entry_flow/block2/unit_1/xception_module/separable_conv2', 'xception/entry_flow/block2/unit_1/xception_module/separable_conv3', 'xception/entry_flow/block2/unit_1/xception_module/shortcut', 'xception/entry_flow/block2/unit_1/xception_module', 'xception/entry_flow/block2', 'xception/entry_flow/block3/unit_1/xception_module/separable_conv1', 'xception/entry_flow/block3/unit_1/xception_module/separable_conv2', 'xception/entry_flow/block3/unit_1/xception_module/separable_conv3', 'xception/entry_flow/block3/unit_1/xception_module/shortcut', 'xception/entry_flow/block3/unit_1/xception_module', 'xception/entry_flow/block3', 'xception/entry_flow/block4/unit_1/xception_module/separable_conv1', 'xception/entry_flow/block4/unit_1/xception_module/separable_conv2', 'xception/entry_flow/block4/unit_1/xception_module/separable_conv3', 'xception/entry_flow/block4/unit_1/xception_module/shortcut', 'xception/entry_flow/block4/unit_1/xception_module', 'xception/entry_flow/block4', 'xception/middle_flow/block1/unit_1/xception_module/separable_conv1', 'xception/middle_flow/block1/unit_1/xception_module/separable_conv2', 'xception/middle_flow/block1/unit_1/xception_module/separable_conv3', 'xception/middle_flow/block1/unit_1/xception_module', 'xception/middle_flow/block1/unit_2/xception_module/separable_conv1', 'xception/middle_flow/block1/unit_2/xception_module/separable_conv2', 'xception/middle_flow/block1/unit_2/xception_module/separable_conv3', 'xception/middle_flow/block1/unit_2/xception_module', 'xception/middle_flow/block1', 'xception/exit_flow/block1/unit_1/xception_module/separable_conv1', 'xception/exit_flow/block1/unit_1/xception_module/separable_conv2', 'xception/exit_flow/block1/unit_1/xception_module/separable_conv3', 'xception/exit_flow/block1/unit_1/xception_module/shortcut', 'xception/exit_flow/block1/unit_1/xception_module', 'xception/exit_flow/block1', 'xception/exit_flow/block2/unit_1/xception_module/separable_conv1', 'xception/exit_flow/block2/unit_1/xception_module/separable_conv2', 'xception/exit_flow/block2/unit_1/xception_module/separable_conv3', 'xception/exit_flow/block2/unit_1/xception_module', 'xception/exit_flow/block2', 'global_pool', 'xception/logits', 'predictions', ] self.assertItemsEqual(end_points.keys(), expected)