示例#1
0
 def testParamsShapeNotFullyDefinedReductionAxes(self):
     if tf.executing_eagerly():
         # Placeholders don't work in eager execution mode.
         return
     inputs = tf.compat.v1.placeholder(tf.float32, shape=(1, 32, None, 4))
     with self.assertRaisesRegexp(ValueError, 'undefined dimensions'):
         norm.group_norm(inputs)
示例#2
0
 def testParamsShapeNotFullyDefinedChannelsAxis(self):
   if tf.executing_eagerly():
     # Placeholders don't work in eager execution mode.
     return
   inputs = tf.compat.v1.placeholder(tf.float32, shape=(1, 3, 4, None))
   with self.assertRaisesRegexp(ValueError, 'undefined channel dimension'):
     norm.group_norm(inputs, channels_axis=-1, reduction_axes=[-3, -2])
示例#3
0
 def testUnknownShape(self):
     if tf.executing_eagerly():
         # Placeholders don't work in eager execution mode.
         return
     inputs = tf.compat.v1.placeholder(tf.float32)
     with self.assertRaisesRegexp(ValueError, 'undefined rank'):
         norm.group_norm(inputs)
示例#4
0
 def testBadCommensurateGroup(self):
   inputs = tf.zeros((5, 4, 10, 10), dtype=tf.float32)
   with self.assertRaisesRegexp(ValueError,
                                '4 channels is not commensurate with '
                                '3 groups.'):
     norm.group_norm(
         inputs, groups=3, reduction_axes=[-2, -1], channels_axis=-3)
示例#5
0
 def testInvalidGroupSize(self):
     inputs = tf.zeros((5, 2, 10, 10), dtype=tf.float32)
     with self.assertRaisesRegexp(ValueError,
                                  'Invalid groups 10 for 2 channels.'):
         norm.group_norm(inputs,
                         groups=10,
                         reduction_axes=[-2, -1],
                         channels_axis=-3)
示例#6
0
 def testAxisIsBad(self):
   inputs = tf.zeros((1, 2, 4, 5), dtype=tf.float32)
   with self.assertRaisesRegexp(ValueError,
                                'Axis is out of bounds.'):
     norm.group_norm(inputs, channels_axis=5)
   with self.assertRaisesRegexp(ValueError,
                                'Axis is out of bounds.'):
     norm.group_norm(inputs, reduction_axes=[1, 5])
示例#7
0
 def testReuseVariables(self):
     if tf.executing_eagerly():
         # Variable reuse doesn't work with eager.
         return
     height, width = 3, 3
     images = tf.random.uniform((5, height, width, 4), seed=1)
     norm.group_norm(images, groups=2, scale=True, scope='IN')
     norm.group_norm(images, groups=2, scale=True, scope='IN', reuse=True)
     self.assertLen(contrib_utils.get_variables_by_name('beta'), 1)
     self.assertLen(contrib_utils.get_variables_by_name('gamma'), 1)
示例#8
0
 def testValueCorrectWithReuseVars(self):
     height, width = 3, 3
     image_shape = (10, height, width, 4)
     images = tf.random.uniform(image_shape, seed=1)
     output_train = norm.group_norm(images, groups=2, scope='IN')
     output_eval = norm.group_norm(images, groups=2, scope='IN', reuse=True)
     with self.cached_session() as sess:
         sess.run(tf.compat.v1.global_variables_initializer())
         # output_train and output_eval should be the same.
         train_np, eval_np = sess.run([output_train, output_eval])
         self.assertAllClose(train_np, eval_np)
示例#9
0
 def testCreateVariables_NCHW(self):
     if tf.executing_eagerly():
         # Collections don't work with eager.
         return
     height, width, groups = 3, 3, 4
     images = tf.random.uniform((5, 2 * groups, height, width), seed=1)
     norm.group_norm(images,
                     groups=4,
                     channels_axis=-3,
                     reduction_axes=(-2, -1),
                     center=True,
                     scale=True)
     self.assertLen(contrib_utils.get_variables_by_name('beta'), 1)
     self.assertLen(contrib_utils.get_variables_by_name('gamma'), 1)
示例#10
0
 def testCreateOpFloat64(self):
   height, width, groups = 3, 3, 5
   images = tf.random.uniform((5, height, width, 4 * groups),
                              dtype=tf.float64,
                              seed=1)
   output = norm.group_norm(images, groups=groups)
   self.assertEqual(tf.float64, output.dtype)
   self.assertListEqual([5, height, width, 4*groups], output.shape.as_list())
示例#11
0
 def testCreateOp(self):
     height, width, groups = 3, 3, 4
     images = tf.random.uniform((5, height, width, 2 * groups), seed=1)
     output = norm.group_norm(images,
                              groups=groups,
                              channels_axis=-1,
                              reduction_axes=[-3, -2])
     self.assertListEqual([5, height, width, 2 * groups],
                          output.shape.as_list())
示例#12
0
 def testParamsShapeNotFullyDefinedBatchAxis(self):
   if tf.executing_eagerly():
     # Placeholders don't work in eager execution mode.
     return
   height, width, groups = 3, 3, 4
   inputs = tf.compat.v1.placeholder(
       tf.float32, shape=(None, height, width, 2 * groups))
   output = norm.group_norm(
       inputs, channels_axis=-1, reduction_axes=[-3, -2], groups=groups)
   self.assertListEqual([None, height, width, 2 * groups],
                        output.shape.as_list())
示例#13
0
 def testCreateOpNoScaleCenter(self):
   if tf.executing_eagerly():
     # Collections don't work with eager.
     return
   height, width, groups = 3, 3, 7
   images = tf.random.uniform((5, height, width, 3 * groups),
                              dtype=tf.float32,
                              seed=1)
   output = norm.group_norm(images, groups=groups, center=False, scale=False)
   self.assertListEqual([5, height, width, 3*groups], output.shape.as_list())
   self.assertEmpty(contrib_utils.get_variables_by_name('beta'))
   self.assertEmpty(contrib_utils.get_variables_by_name('gamma'))
示例#14
0
 def testNotMutuallyExclusiveAxis(self):
     inputs = tf.zeros((10, 32, 32, 32), dtype=tf.float32)
     # Specify axis with negative values.
     with self.assertRaisesRegexp(ValueError, 'mutually exclusive'):
         norm.group_norm(inputs, channels_axis=-2, reduction_axes=[-2])
     # Specify axis with positive values.
     with self.assertRaisesRegexp(ValueError, 'mutually exclusive'):
         norm.group_norm(inputs, channels_axis=1, reduction_axes=[1, 3])
     # Specify axis with mixed positive and negative values.
     with self.assertRaisesRegexp(ValueError, 'mutually exclusive'):
         norm.group_norm(inputs, channels_axis=-2, reduction_axes=[2])
示例#15
0
    def doOutputTest(self,
                     input_shape,
                     channels_axis=None,
                     reduction_axes=None,
                     mean_close_to_zero=False,
                     groups=2,
                     tol=1e-2):
        # Select the axis for the channel and the dimensions along which statistics
        # are accumulated.
        if channels_axis < 0:
            channels_axis += len(input_shape)
        reduced_axes = [channels_axis + 1]
        for a in reduction_axes:
            if a < 0:
                a += len(input_shape)
            if a < channels_axis:
                reduced_axes.append(a)
            else:
                reduced_axes.append(a + 1)
        reduced_axes = tuple(reduced_axes)

        # Calculate the final shape for the output Tensor.
        axes_before_channels = input_shape[:channels_axis]
        axes_after_channels = input_shape[channels_axis + 1:]
        channels = input_shape[channels_axis]
        outputs_shape = (axes_before_channels + [groups, channels // groups] +
                         axes_after_channels)

        # Calculate the final shape for the output statistics.
        reduced_shape = []
        for i, a in enumerate(outputs_shape):
            if i not in reduced_axes:
                reduced_shape.append(a)

        if mean_close_to_zero:
            mu_tuple = (1e-4, 1e-2, 1.0)
            sigma_tuple = (1e-2, 0.1, 1.0)
        else:
            mu_tuple = (1.0, 1e2)
            sigma_tuple = (1.0, 0.1)

        for mu in mu_tuple:
            for sigma in sigma_tuple:
                # Determine shape of Tensor after norm.
                expected_mean = np.zeros(reduced_shape)
                expected_var = np.ones(reduced_shape)

                inputs = tf.random.normal(input_shape, seed=0) * sigma + mu
                output_op = norm.group_norm(
                    inputs,
                    groups=groups,
                    center=False,
                    scale=False,
                    channels_axis=channels_axis,
                    reduction_axes=reduction_axes,
                    mean_close_to_zero=mean_close_to_zero)
                with self.cached_session() as sess:
                    sess.run(tf.compat.v1.global_variables_initializer())
                    outputs = sess.run(output_op)
                    # Make sure that there are no NaNs
                    self.assertFalse(np.isnan(outputs).any())

                    outputs = np.reshape(outputs, outputs_shape)
                    mean = np.mean(outputs, axis=reduced_axes)
                    var = np.var(outputs, axis=reduced_axes)
                    # The mean and variance of each example should be close to 0 and 1
                    # respectively.
                    self.assertAllClose(expected_mean,
                                        mean,
                                        rtol=tol,
                                        atol=tol)
                    self.assertAllClose(expected_var, var, rtol=tol, atol=tol)