diff options
Diffstat (limited to 'tensorflow/python/kernel_tests/clip_ops_test.py')
-rw-r--r-- | tensorflow/python/kernel_tests/clip_ops_test.py | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/tensorflow/python/kernel_tests/clip_ops_test.py b/tensorflow/python/kernel_tests/clip_ops_test.py new file mode 100644 index 0000000000..46bba7514d --- /dev/null +++ b/tensorflow/python/kernel_tests/clip_ops_test.py @@ -0,0 +1,222 @@ +"""Tests for tensorflow.ops.clip_ops.""" + +import tensorflow.python.platform + +import tensorflow as tf + + +class ClipTest(tf.test.TestCase): + + # ClipByValue test + def testClipByValue(self): + with self.test_session(): + x = tf.constant([-5.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3]) + np_ans = [[-4.4, 2.0, 3.0], + [4.0, 4.4, 4.4]] + clip_value = 4.4 + ans = tf.clip_by_value(x, -clip_value, clip_value) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByValueNonFinite(self): + with self.test_session(): + x = tf.constant([float('NaN'), float('Inf'), -float('Inf')]) + np_ans = [float('NaN'), 4.0, -4.0] + clip_value = 4.0 + ans = tf.clip_by_value(x, -clip_value, clip_value) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + # ClipByNorm tests + def testClipByNormClipped(self): + # Norm clipping when clip_norm < 5 + with self.test_session(): + x = tf.constant([-3.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + # Norm of x = sqrt(3^2 + 4^2) = 5 + np_ans = [[-2.4, 0.0, 0.0], + [3.2, 0.0, 0.0]] + clip_norm = 4.0 + ans = tf.clip_by_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByNormNotClipped(self): + # No norm clipping when clip_norm >= 5 + with self.test_session(): + x = tf.constant([-3.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + # Norm of x = sqrt(3^2 + 4^2) = 5 + np_ans = [[-3.0, 0.0, 0.0], + [4.0, 0.0, 0.0]] + clip_norm = 6.0 + ans = tf.clip_by_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByNormZero(self): + # No norm clipping when norm = 0 + with self.test_session(): + x = tf.constant([0.0, 0.0, 0.0, 0.0, 0.0, 0.0], shape=[2, 3]) + # Norm = 0, no changes + np_ans = [[0.0, 0.0, 0.0], + [0.0, 0.0, 0.0]] + clip_norm = 6.0 + ans = tf.clip_by_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByGlobalNormClipped(self): + # Norm clipping when clip_norm < 5 + with self.test_session(): + x0 = tf.constant([-2.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + x1 = tf.constant([1.0, -2.0]) + # Global norm of x0 and x1 = sqrt(1 + 4^2 + 2^2 + 2^2) = 5 + clip_norm = 4.0 + + # Answers are the original tensors scaled by 4.0/5.0 + np_ans_0 = [[-1.6, 0.0, 0.0], + [3.2, 0.0, 0.0]] + np_ans_1 = [0.8, -1.6] + + ans, norm = tf.clip_by_global_norm((x0, x1), clip_norm) + tf_ans_1 = ans[0].eval() + tf_ans_2 = ans[1].eval() + tf_norm = norm.eval() + + self.assertAllClose(tf_norm, 5.0) + self.assertAllClose(np_ans_0, tf_ans_1) + self.assertAllClose(np_ans_1, tf_ans_2) + + def testClipByGlobalNormSupportsNone(self): + # Norm clipping when clip_norm < 5 + with self.test_session(): + x0 = tf.constant([-2.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + x1 = tf.constant([1.0, -2.0]) + # Global norm of x0 and x1 = sqrt(1 + 4^2 + 2^2 + 2^2) = 5 + clip_norm = 4.0 + + # Answers are the original tensors scaled by 4.0/5.0 + np_ans_0 = [[-1.6, 0.0, 0.0], + [3.2, 0.0, 0.0]] + np_ans_1 = [0.8, -1.6] + + ans, norm = tf.clip_by_global_norm((x0, None, x1, None), clip_norm) + self.assertTrue(ans[1] is None) + self.assertTrue(ans[3] is None) + tf_ans_1 = ans[0].eval() + tf_ans_2 = ans[2].eval() + tf_norm = norm.eval() + + self.assertAllClose(tf_norm, 5.0) + self.assertAllClose(np_ans_0, tf_ans_1) + self.assertAllClose(np_ans_1, tf_ans_2) + + # ClipByGlobalNorm tests + def testClipByGlobalNormWithIndexedSlicesClipped(self): + # Norm clipping when clip_norm < 5 + with self.test_session(): + x0 = tf.constant([-2.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + x1 = tf.IndexedSlices(tf.constant([1.0, -2.0]), + tf.constant([3, 4])) + # Global norm of x0 and x1 = sqrt(1 + 4^2 + 2^2 + 2^2) = 5 + clip_norm = 4.0 + + # Answers are the original tensors scaled by 4.0/5.0 + np_ans_0 = [[-1.6, 0.0, 0.0], + [3.2, 0.0, 0.0]] + np_ans_1 = [0.8, -1.6] + + ans, norm = tf.clip_by_global_norm([x0, x1], clip_norm) + tf_ans_1 = ans[0].eval() + tf_ans_2 = ans[1].values.eval() + tf_norm = norm.eval() + + self.assertAllClose(tf_norm, 5.0) + self.assertAllClose(np_ans_0, tf_ans_1) + self.assertAllClose(np_ans_1, tf_ans_2) + + def testClipByGlobalNormNotClipped(self): + # No norm clipping when clip_norm >= 5 + with self.test_session(): + x0 = tf.constant([-2.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + x1 = tf.constant([1.0, -2.0]) + # Global norm of x0 and x1 = sqrt(1 + 4^2 + 2^2 + 2^2) = 5 + np_ans_0 = [[-2.0, 0.0, 0.0], + [4.0, 0.0, 0.0]] + np_ans_1 = [1.0, -2.0] + clip_norm = 6.0 + + ans, norm = tf.clip_by_global_norm([x0, x1], clip_norm) + tf_ans_1 = ans[0].eval() + tf_ans_2 = ans[1].eval() + tf_norm = norm.eval() + + self.assertAllClose(tf_norm, 5.0) + self.assertAllClose(np_ans_0, tf_ans_1) + self.assertAllClose(np_ans_1, tf_ans_2) + + def testClipByGlobalNormZero(self): + # No norm clipping when norm = 0 + with self.test_session(): + x0 = tf.constant([0.0, 0.0, 0.0, 0.0, 0.0, 0.0], shape=[2, 3]) + x1 = tf.constant([0.0, 0.0]) + # Norm = 0, no changes + np_ans_0 = [[0.0, 0.0, 0.0], + [0.0, 0.0, 0.0]] + np_ans_1 = [0.0, 0.0] + clip_norm = 6.0 + + ans, norm = tf.clip_by_global_norm([x0, x1], clip_norm) + tf_ans_1 = ans[0].eval() + tf_ans_2 = ans[1].eval() + tf_norm = norm.eval() + + self.assertAllClose(tf_norm, 0.0) + self.assertAllClose(np_ans_0, tf_ans_1) + self.assertAllClose(np_ans_1, tf_ans_2) + + def testClipByAverageNormClipped(self): + # Norm clipping when average clip_norm < 0.83333333 + with self.test_session(): + x = tf.constant([-3.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + # Average norm of x = sqrt(3^2 + 4^2) / 6 = 0.83333333 + np_ans = [[-2.88, 0.0, 0.0], + [3.84, 0.0, 0.0]] + clip_norm = 0.8 + ans = tf.clip_by_average_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByAverageNormNotClipped(self): + # No norm clipping when average clip_norm >= 0.83333333 + with self.test_session(): + x = tf.constant([-3.0, 0.0, 0.0, 4.0, 0.0, 0.0], shape=[2, 3]) + # Average norm of x = sqrt(3^2 + 4^2) / 6 = 0.83333333 + np_ans = [[-3.0, 0.0, 0.0], + [4.0, 0.0, 0.0]] + clip_norm = 0.9 + ans = tf.clip_by_average_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + + def testClipByAverageNormZero(self): + # No norm clipping when average clip_norm = 0 + with self.test_session(): + x = tf.constant([0.0, 0.0, 0.0, 0.0, 0.0, 0.0], shape=[2, 3]) + # Average norm = 0, no changes + np_ans = [[0.0, 0.0, 0.0], + [0.0, 0.0, 0.0]] + clip_norm = 0.9 + ans = tf.clip_by_average_norm(x, clip_norm) + tf_ans = ans.eval() + + self.assertAllClose(np_ans, tf_ans) + +if __name__ == "__main__": + tf.test.main() |