aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/python/kernel_tests/clip_ops_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/python/kernel_tests/clip_ops_test.py')
-rw-r--r--tensorflow/python/kernel_tests/clip_ops_test.py222
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()