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 testUseBoundedAcitvation(self):
     global_pool = False
     num_classes = 10
     output_stride = 8
     for use_bounded_activation in (True, False):
         tf.reset_default_graph()
         inputs = create_test_input(2, 321, 321, 3)
         with slim.arg_scope(
                 xception.xception_arg_scope(
                     use_bounded_activation=use_bounded_activation)):
             _, _ = self._xception_small(inputs,
                                         num_classes,
                                         global_pool=global_pool,
                                         output_stride=output_stride,
                                         scope='xception')
             for node in tf.get_default_graph().as_graph_def().node:
                 if node.op.startswith('Relu'):
                     self.assertEqual(node.op == 'Relu6',
                                      use_bounded_activation)
 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 six.iteritems(endpoint_to_shape):
             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 six.iteritems(endpoint_to_shape):
             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)