From 3406ee7ca7d15f89189585b07e0c6a280c6a2c88 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 20 Aug 2020 20:52:04 -0400 Subject: [PATCH 01/15] Add the `size` API for TensorFlow NumPy operations. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 12 ++++++++++++ .../python/ops/numpy_ops/np_array_ops_test.py | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index 866c66a7d14..c611552a078 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -560,6 +560,18 @@ def _reduce(tf_fn, tf_fn(input_tensor=a.data, axis=axis, keepdims=keepdims)) +@utils.np_doc('size') +def size(x): + x = x.numpy() if isinstance(x, tf.Tensor) else x + if isinstance(x, (int, float, onp.int32, onp.int64, onp.float32, onp.float64)): + return 1 + elif isinstance(x, (np.ndarray, onp.ndarray)): + return np.prod(x.shape) + else: + raise TypeError("The inputs must be one of types {int, float, numpy array" + ", TensorFlow Tensor, TensorFlow ndarray} object.") + + @np_utils.np_doc('sum') def sum(a, axis=None, dtype=None, keepdims=None): # pylint: disable=redefined-builtin return _reduce( diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 845db14935b..39ec6d1fe59 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -804,6 +804,23 @@ class ArrayMethodsTest(test.TestCase): def testAmax(self): self._testReduce(np_array_ops.amax, np.amax, 'amax') + def testSize(self): + + def run_test(arr): + onp_arr = arr.numpy() if isinstance(arr, tf.Tensor) else arr + print(onp_arr) + self.assertEqual(np_size(arr), onp.size(onp_arr)) + + run_test(np.array([1])) + run_test(np.array([1, 2, 3, 4, 5])) + run_test(np.ones((2, 3, 2))) + run_test(np.ones((3, 2))) + run_test(np.zeros((5, 6, 7))) + run_test(1) + run_test(onp.ones((3, 2, 1))) + run_test(tf.constant(5)) + run_test(tf.constant([1, 1, 1])) + def testRavel(self): def run_test(arr, *args, **kwargs): From 776227e60279d53ed1dea42da2f8f1bb8589978e Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 20 Aug 2020 20:58:37 -0400 Subject: [PATCH 02/15] Remove the `print` statement. --- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 39ec6d1fe59..84b6173c8b6 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -808,7 +808,6 @@ class ArrayMethodsTest(test.TestCase): def run_test(arr): onp_arr = arr.numpy() if isinstance(arr, tf.Tensor) else arr - print(onp_arr) self.assertEqual(np_size(arr), onp.size(onp_arr)) run_test(np.array([1])) From 9c4d5ff8fbc94f9d8317584473ebd0c45ddebaf0 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Sat, 22 Aug 2020 10:53:36 -0400 Subject: [PATCH 03/15] Revise the code format according to pylint. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index c611552a078..f3475fc868d 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -563,7 +563,8 @@ def _reduce(tf_fn, @utils.np_doc('size') def size(x): x = x.numpy() if isinstance(x, tf.Tensor) else x - if isinstance(x, (int, float, onp.int32, onp.int64, onp.float32, onp.float64)): + if isinstance(x, (int, float, onp.int32, onp.int64, + onp.float32, onp.float64)): return 1 elif isinstance(x, (np.ndarray, onp.ndarray)): return np.prod(x.shape) From 706552aa1c9876cf08bca90262865f10b3bf59d2 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Sat, 29 Aug 2020 22:49:59 -0400 Subject: [PATCH 04/15] 1. Use `np.asarray` wrapper to process the input in order to be able to deal with grapg tensors; 2. Add the `axis` parameter into the `size` API, raise `NotImplementedError` when the not-None `axis` parameter is sent in. Add the according tests. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 8 ++++++-- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index f3475fc868d..1dce59b7cde 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -560,9 +560,13 @@ def _reduce(tf_fn, tf_fn(input_tensor=a.data, axis=axis, keepdims=keepdims)) +# TODO (DarrenZhang01): Add `axis` support to the `size` API. @utils.np_doc('size') -def size(x): - x = x.numpy() if isinstance(x, tf.Tensor) else x +def size(x, axis=None): + if axis is not None: + raise NotImplementedError("axis argument is not supported in the current `np.size` " + "implementation") + x = asarray(x).data if isinstance(x, (int, float, onp.int32, onp.int64, onp.float32, onp.float64)): return 1 diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 84b6173c8b6..1d0e508e3d7 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -806,9 +806,9 @@ class ArrayMethodsTest(test.TestCase): def testSize(self): - def run_test(arr): + def run_test(arr, axis=None): onp_arr = arr.numpy() if isinstance(arr, tf.Tensor) else arr - self.assertEqual(np_size(arr), onp.size(onp_arr)) + self.assertEqual(np_array_ops.size(arr, axis), onp.size(onp_arr, axis)) run_test(np.array([1])) run_test(np.array([1, 2, 3, 4, 5])) @@ -819,6 +819,7 @@ class ArrayMethodsTest(test.TestCase): run_test(onp.ones((3, 2, 1))) run_test(tf.constant(5)) run_test(tf.constant([1, 1, 1])) + self.assertRaises(ValueError, run_test, np.ones((2, 2)), 1) def testRavel(self): From 9a9bec8fc7b971c7d8454f214b5b98d3e26cb3ce Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Sat, 29 Aug 2020 22:59:42 -0400 Subject: [PATCH 05/15] 1. Add `# pylint: disable=missing-docstring` label beside the function; 2. Revise the name of TF NumPy and vanilla NumPy according to the imports. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index 1dce59b7cde..eb60b1b8653 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -562,16 +562,16 @@ def _reduce(tf_fn, # TODO (DarrenZhang01): Add `axis` support to the `size` API. @utils.np_doc('size') -def size(x, axis=None): +def size(x, axis=None): # pylint: disable=missing-docstring if axis is not None: - raise NotImplementedError("axis argument is not supported in the current `np.size` " - "implementation") + raise NotImplementedError("axis argument is not supported in the current " + "`np.size` implementation") x = asarray(x).data - if isinstance(x, (int, float, onp.int32, onp.int64, - onp.float32, onp.float64)): + if isinstance(x, (int, float, np.int32, np.int64, + np.float32, np.float64)): return 1 - elif isinstance(x, (np.ndarray, onp.ndarray)): - return np.prod(x.shape) + elif isinstance(x, (np_arrays.ndarray, np.ndarray)): + return prod(x.shape) else: raise TypeError("The inputs must be one of types {int, float, numpy array" ", TensorFlow Tensor, TensorFlow ndarray} object.") From 1f87eacbbf66c19e1a864c4b4623db4bcaf2fe9e Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Sat, 29 Aug 2020 23:05:07 -0400 Subject: [PATCH 06/15] Revise `utils` to `np_utils`. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index eb60b1b8653..a1208fc3341 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -561,7 +561,7 @@ def _reduce(tf_fn, # TODO (DarrenZhang01): Add `axis` support to the `size` API. -@utils.np_doc('size') +@np_utils.np_doc('size') def size(x, axis=None): # pylint: disable=missing-docstring if axis is not None: raise NotImplementedError("axis argument is not supported in the current " From 2adfcfc8f23cb5e35b47a23e9ecf7aabda1659c8 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Mon, 31 Aug 2020 14:24:38 -0400 Subject: [PATCH 07/15] Revise the bug in the test code. --- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 1d0e508e3d7..fa1f50e3841 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -807,7 +807,7 @@ class ArrayMethodsTest(test.TestCase): def testSize(self): def run_test(arr, axis=None): - onp_arr = arr.numpy() if isinstance(arr, tf.Tensor) else arr + onp_arr = np.array(arr).data self.assertEqual(np_array_ops.size(arr, axis), onp.size(onp_arr, axis)) run_test(np.array([1])) From fc5de5045086933fa7a657f0133b353a80b5d04a Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Mon, 31 Aug 2020 15:12:06 -0400 Subject: [PATCH 08/15] Improve the `size` API and revise some bugs. --- .../python/ops/numpy_ops/np_array_ops.py | 3 ++- .../python/ops/numpy_ops/np_array_ops_test.py | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index a1208fc3341..803e8b9c821 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -24,6 +24,7 @@ import numbers import numpy as np import six +import tensorflow as tf from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes from tensorflow.python.framework import ops @@ -563,10 +564,10 @@ def _reduce(tf_fn, # TODO (DarrenZhang01): Add `axis` support to the `size` API. @np_utils.np_doc('size') def size(x, axis=None): # pylint: disable=missing-docstring + x = np.asarray(x) if isinstance(x, tf.Tensor) else x if axis is not None: raise NotImplementedError("axis argument is not supported in the current " "`np.size` implementation") - x = asarray(x).data if isinstance(x, (int, float, np.int32, np.int64, np.float32, np.float64)): return 1 diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index fa1f50e3841..693bbde68f2 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -24,6 +24,7 @@ import numpy as np from six.moves import range from six.moves import zip +import tensorflow as tf from tensorflow.python.eager import context from tensorflow.python.framework import config from tensorflow.python.framework import constant_op @@ -807,19 +808,19 @@ class ArrayMethodsTest(test.TestCase): def testSize(self): def run_test(arr, axis=None): - onp_arr = np.array(arr).data - self.assertEqual(np_array_ops.size(arr, axis), onp.size(onp_arr, axis)) + onp_arr = np.array(arr) if isinstance(arr, tf.Tensor) else arr + self.assertEqual(np_array_ops.size(arr, axis), np.size(onp_arr, axis)) - run_test(np.array([1])) - run_test(np.array([1, 2, 3, 4, 5])) - run_test(np.ones((2, 3, 2))) - run_test(np.ones((3, 2))) - run_test(np.zeros((5, 6, 7))) + run_test(np_array_ops.array([1])) + run_test(np_array_ops.array([1, 2, 3, 4, 5])) + run_test(np_array_ops.ones((2, 3, 2))) + run_test(np_array_ops.ones((3, 2))) + run_test(np_array_ops.zeros((5, 6, 7))) run_test(1) - run_test(onp.ones((3, 2, 1))) + run_test(np_array_ops.ones((3, 2, 1))) run_test(tf.constant(5)) run_test(tf.constant([1, 1, 1])) - self.assertRaises(ValueError, run_test, np.ones((2, 2)), 1) + self.assertRaises(NotImplementedError, size, np.ones((2, 2)), 1) def testRavel(self): From d70b16b8a54d15afc9b0fc33f0bbe93ba22ba456 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Tue, 1 Sep 2020 14:23:23 -0400 Subject: [PATCH 09/15] Revise the code to handle the graph tensors. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 6 +++--- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index 803e8b9c821..a2d13fed6b1 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -564,15 +564,15 @@ def _reduce(tf_fn, # TODO (DarrenZhang01): Add `axis` support to the `size` API. @np_utils.np_doc('size') def size(x, axis=None): # pylint: disable=missing-docstring - x = np.asarray(x) if isinstance(x, tf.Tensor) else x + x = asarray(x).data if axis is not None: raise NotImplementedError("axis argument is not supported in the current " "`np.size` implementation") if isinstance(x, (int, float, np.int32, np.int64, np.float32, np.float64)): return 1 - elif isinstance(x, (np_arrays.ndarray, np.ndarray)): - return prod(x.shape) + elif isinstance(x, (np_arrays.ndarray, np.ndarray)) or tf.is_tensor(x): + return prod(tuple(x.shape)) else: raise TypeError("The inputs must be one of types {int, float, numpy array" ", TensorFlow Tensor, TensorFlow ndarray} object.") diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 693bbde68f2..b0d036b66bd 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -19,7 +19,6 @@ from __future__ import division from __future__ import print_function import itertools -import sys import numpy as np from six.moves import range from six.moves import zip @@ -808,7 +807,7 @@ class ArrayMethodsTest(test.TestCase): def testSize(self): def run_test(arr, axis=None): - onp_arr = np.array(arr) if isinstance(arr, tf.Tensor) else arr + onp_arr = np.array(arr) self.assertEqual(np_array_ops.size(arr, axis), np.size(onp_arr, axis)) run_test(np_array_ops.array([1])) @@ -820,7 +819,8 @@ class ArrayMethodsTest(test.TestCase): run_test(np_array_ops.ones((3, 2, 1))) run_test(tf.constant(5)) run_test(tf.constant([1, 1, 1])) - self.assertRaises(NotImplementedError, size, np.ones((2, 2)), 1) + self.assertRaises(NotImplementedError, np_array_ops.size, + np.ones((2, 2)), 1) def testRavel(self): From e514f7c96099f22ea96988417f5f93ba2aabc98d Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 3 Sep 2020 15:20:03 -0400 Subject: [PATCH 10/15] 1. Use tf.size to deal with None shapes; 2. Change from external import to intern import. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 12 ++++++++---- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index a2d13fed6b1..1377f7ac959 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -24,11 +24,11 @@ import numbers import numpy as np import six -import tensorflow as tf from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes from tensorflow.python.framework import ops from tensorflow.python.framework import tensor_shape +from tensorflow.python.framework import tensor_util from tensorflow.python.ops import array_ops from tensorflow.python.ops import clip_ops from tensorflow.python.ops import control_flow_ops @@ -564,15 +564,19 @@ def _reduce(tf_fn, # TODO (DarrenZhang01): Add `axis` support to the `size` API. @np_utils.np_doc('size') def size(x, axis=None): # pylint: disable=missing-docstring - x = asarray(x).data if axis is not None: raise NotImplementedError("axis argument is not supported in the current " "`np.size` implementation") if isinstance(x, (int, float, np.int32, np.int64, np.float32, np.float64)): return 1 - elif isinstance(x, (np_arrays.ndarray, np.ndarray)) or tf.is_tensor(x): - return prod(tuple(x.shape)) + # Turn possible graph tensors into non-graph tensors. + x = asarray(x).data + if isinstance(x, (np_arrays.ndarray, np.ndarray)) or tensor_util.is_tensor(x): + if x.shape.is_fully_defined(): + return prod(tuple(x.shape)) + else: + return array_ops.size_v2(x) else: raise TypeError("The inputs must be one of types {int, float, numpy array" ", TensorFlow Tensor, TensorFlow ndarray} object.") diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index b0d036b66bd..c6206fd771c 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -20,10 +20,10 @@ from __future__ import print_function import itertools import numpy as np +import sys from six.moves import range from six.moves import zip -import tensorflow as tf from tensorflow.python.eager import context from tensorflow.python.framework import config from tensorflow.python.framework import constant_op @@ -817,8 +817,8 @@ class ArrayMethodsTest(test.TestCase): run_test(np_array_ops.zeros((5, 6, 7))) run_test(1) run_test(np_array_ops.ones((3, 2, 1))) - run_test(tf.constant(5)) - run_test(tf.constant([1, 1, 1])) + run_test(constant_op.constant(5)) + run_test(constant_op.constant([1, 1, 1])) self.assertRaises(NotImplementedError, np_array_ops.size, np.ones((2, 2)), 1) From c65af0222977d70660761e664eebb2dd5664e7e7 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 3 Sep 2020 15:24:34 -0400 Subject: [PATCH 11/15] Import `sys` at the original place in order to avoid unnecessary changes. --- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index c6206fd771c..ec882218e89 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -19,8 +19,8 @@ from __future__ import division from __future__ import print_function import itertools -import numpy as np import sys +import numpy as np from six.moves import range from six.moves import zip From 4e9c20d05d2651dc02ad0377547ee24e9551d35a Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 3 Sep 2020 17:13:47 -0400 Subject: [PATCH 12/15] Add test case for the `None` shape case as pointed out in https://github.com/tensorflow/tensorflow/pull/42539#issuecomment-686715283. --- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index ec882218e89..469d81557fd 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -25,12 +25,14 @@ from six.moves import range from six.moves import zip from tensorflow.python.eager import context +from tensorflow.python.eager import def_function from tensorflow.python.framework import config from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes from tensorflow.python.framework import indexed_slices from tensorflow.python.framework import ops from tensorflow.python.framework import tensor_shape +from tensorflow.python.framework import tensor_spec from tensorflow.python.ops import array_ops from tensorflow.python.ops.numpy_ops import np_array_ops from tensorflow.python.ops.numpy_ops import np_arrays @@ -822,6 +824,13 @@ class ArrayMethodsTest(test.TestCase): self.assertRaises(NotImplementedError, np_array_ops.size, np.ones((2, 2)), 1) + @def_function.function(input_signature=[tensor_spec.TensorSpec(shape=None)]) + def f(arr): + arr = np_array_ops.asarray(arr) + return np_array_ops.size(arr) + + self.assertEqual(f(np_array_ops.ones((3, 2))).numpy(), 6) + def testRavel(self): def run_test(arr, *args, **kwargs): From feb0a771284df62a5162f24cb1eefde7134186c7 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Thu, 3 Sep 2020 18:43:43 -0400 Subject: [PATCH 13/15] Remove some unnecessary `if...else...` statement; Wrap the return value with an ndarray converter. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 11 +++-------- tensorflow/python/ops/numpy_ops/np_array_ops_test.py | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index 1377f7ac959..d8be34c31cb 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -570,16 +570,11 @@ def size(x, axis=None): # pylint: disable=missing-docstring if isinstance(x, (int, float, np.int32, np.int64, np.float32, np.float64)): return 1 - # Turn possible graph tensors into non-graph tensors. x = asarray(x).data - if isinstance(x, (np_arrays.ndarray, np.ndarray)) or tensor_util.is_tensor(x): - if x.shape.is_fully_defined(): - return prod(tuple(x.shape)) - else: - return array_ops.size_v2(x) + if x.shape.is_fully_defined(): + return prod(tuple(x.shape)) else: - raise TypeError("The inputs must be one of types {int, float, numpy array" - ", TensorFlow Tensor, TensorFlow ndarray} object.") + return np_utils.tensor_to_ndarray(array_ops.size_v2(x)) @np_utils.np_doc('sum') diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py index 469d81557fd..7a376ac91d6 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops_test.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops_test.py @@ -829,7 +829,7 @@ class ArrayMethodsTest(test.TestCase): arr = np_array_ops.asarray(arr) return np_array_ops.size(arr) - self.assertEqual(f(np_array_ops.ones((3, 2))).numpy(), 6) + self.assertEqual(f(np_array_ops.ones((3, 2))).data.numpy(), 6) def testRavel(self): From df04b17d6fb1c2b60ada1bb11c8864519e44213e Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Fri, 4 Sep 2020 19:36:32 -0400 Subject: [PATCH 14/15] Add the change after running bazel. --- .../py/numpy/tf_numpy_api/tensorflow.experimental.numpy.pbtxt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/third_party/py/numpy/tf_numpy_api/tensorflow.experimental.numpy.pbtxt b/third_party/py/numpy/tf_numpy_api/tensorflow.experimental.numpy.pbtxt index f5ffcf9e244..7fdb4d0f38a 100644 --- a/third_party/py/numpy/tf_numpy_api/tensorflow.experimental.numpy.pbtxt +++ b/third_party/py/numpy/tf_numpy_api/tensorflow.experimental.numpy.pbtxt @@ -784,6 +784,10 @@ tf_module { name: "sinh" argspec: "args=[\'x\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "size" + argspec: "args=[\'x\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "sort" argspec: "args=[\'a\', \'axis\', \'kind\', \'order\'], varargs=None, keywords=None, defaults=[\'-1\', \'quicksort\', \'None\'], " From fcfe64be4ca16c98b6e4a480c3207a3d9c3648e5 Mon Sep 17 00:00:00 2001 From: DarrenZhang01 <18633059886@163.com> Date: Tue, 8 Sep 2020 19:45:54 -0400 Subject: [PATCH 15/15] Remove the unnecessary import based on `https://github.com/tensorflow/tensorflow/pull/42539#discussion_r485189850`. --- tensorflow/python/ops/numpy_ops/np_array_ops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow/python/ops/numpy_ops/np_array_ops.py b/tensorflow/python/ops/numpy_ops/np_array_ops.py index d8be34c31cb..d473717adc8 100644 --- a/tensorflow/python/ops/numpy_ops/np_array_ops.py +++ b/tensorflow/python/ops/numpy_ops/np_array_ops.py @@ -28,7 +28,6 @@ from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes from tensorflow.python.framework import ops from tensorflow.python.framework import tensor_shape -from tensorflow.python.framework import tensor_util from tensorflow.python.ops import array_ops from tensorflow.python.ops import clip_ops from tensorflow.python.ops import control_flow_ops