add gather split squeeze stack unsqueeze api (#24035)

* add gather split squeeze stack unsqueeze api test=develop

* add gather split squeeze stack unsqueeze api test=develop

* fix bug test=develop

* fix bug test=develop

* fix bug test=develop

* fix bug test=develop

* fix bug test=develop
revert-22778-infer_var_type
Qinghe JING 5 years ago committed by GitHub
parent a164b10d05
commit 13b03e7ad6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -166,7 +166,7 @@ from .tensor.linalg import cross #DEFINE_ALIAS
# from .tensor.manipulation import expand #DEFINE_ALIAS
# from .tensor.manipulation import expand_as #DEFINE_ALIAS
# from .tensor.manipulation import flatten #DEFINE_ALIAS
# from .tensor.manipulation import gather #DEFINE_ALIAS
from .tensor.manipulation import gather #DEFINE_ALIAS
# from .tensor.manipulation import gather_nd #DEFINE_ALIAS
# from .tensor.manipulation import reshape #DEFINE_ALIAS
# from .tensor.manipulation import reverse #DEFINE_ALIAS
@ -175,14 +175,14 @@ from .tensor.linalg import cross #DEFINE_ALIAS
# from .tensor.manipulation import scatter_nd #DEFINE_ALIAS
# from .tensor.manipulation import shard_index #DEFINE_ALIAS
# from .tensor.manipulation import slice #DEFINE_ALIAS
# from .tensor.manipulation import split #DEFINE_ALIAS
# from .tensor.manipulation import squeeze #DEFINE_ALIAS
# from .tensor.manipulation import stack #DEFINE_ALIAS
from .tensor.manipulation import split #DEFINE_ALIAS
from .tensor.manipulation import squeeze #DEFINE_ALIAS
from .tensor.manipulation import stack #DEFINE_ALIAS
# from .tensor.manipulation import strided_slice #DEFINE_ALIAS
# from .tensor.manipulation import transpose #DEFINE_ALIAS
# from .tensor.manipulation import unique #DEFINE_ALIAS
# from .tensor.manipulation import unique_with_counts #DEFINE_ALIAS
# from .tensor.manipulation import unsqueeze #DEFINE_ALIAS
from .tensor.manipulation import unsqueeze #DEFINE_ALIAS
# from .tensor.manipulation import unstack #DEFINE_ALIAS
from .tensor.manipulation import flip #DEFINE_ALIAS
# from .tensor.manipulation import unbind #DEFINE_ALIAS

@ -17,6 +17,8 @@ from __future__ import print_function
import unittest
import numpy as np
from op_test import OpTest
import paddle
import paddle.fluid as fluid
class TestGatherOp(OpTest):
@ -106,5 +108,35 @@ class TestCase6(TestGatherOp):
self.index_type = "int32"
class API_TestGather(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data('data1', shape=[-1, 2], dtype='float64')
index = fluid.layers.data('index', shape=[-1, 1], dtype='float64')
out = paddle.gather(data1, index)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input = np.array([[1, 2], [3, 4], [5, 6]])
index_1 = np.array([1, 2])
result, = exe.run(feed={"data1": input,
"index": index_1},
fetch_list=[out])
expected_output = np.array([[3, 4], [5, 6]])
self.assertTrue(np.allclose(result, expected_output))
class API_TestDygraphGather(unittest.TestCase):
def test_out(self):
with fluid.dygraph.guard():
input_1 = np.array([[1, 2], [3, 4], [5, 6]])
index_1 = np.array([1, 2])
input = fluid.dygraph.to_variable(input_1)
index = fluid.dygraph.to_variable(index_1)
output = paddle.fluid.layers.gather(input, index)
output_np = output.numpy()
expected_output = np.array([[3, 4], [5, 6]])
self.assertTrue(np.allclose(output_np, expected_output))
if __name__ == "__main__":
unittest.main()

@ -13,7 +13,7 @@
# limitations under the License.
from __future__ import print_function
import paddle
import unittest
import numpy as np
from op_test import OpTest
@ -278,6 +278,101 @@ class TestSplitOpError(unittest.TestCase):
self.assertRaises(TypeError, test_num_or_sections_type)
def test_num_or_sections_type_tensor():
x7 = fluid.layers.data(shape=[4], dtype='float16', name='x5')
paddle.split(input=x7, num_or_sections=2.1, dim=3)
self.assertRaises(TypeError, test_num_or_sections_type_tensor)
def test_axis_type_tensor():
x8 = fluid.layers.data(shape=[4], dtype='float16', name='x6')
paddle.split(input=x8, num_or_sections=2, dim=3.2)
self.assertRaises(TypeError, test_axis_type_tensor)
class API_TestSplit(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data('data1', shape=[4, 6, 6], dtype='float64')
data2 = fluid.layers.data('data2', shape=[1], dtype='int32')
x0, x1, x2 = paddle.split(data1, num_or_sections=3, dim=data2)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([4, 6, 6]).astype('float64')
input2 = np.array([2]).astype('int32')
r0, r1, r2, = exe.run(feed={"data1": input1,
"data2": input2},
fetch_list=[x0, x1, x2])
ex_x0, ex_x1, ex_x2 = np.split(input1, 3, axis=2)
self.assertTrue(np.allclose(ex_x0, r0))
self.assertTrue(np.allclose(ex_x1, r1))
self.assertTrue(np.allclose(ex_x2, r2))
class API_TestSplit2(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data('data1', shape=[4, 6, 6], dtype='float64')
x0, x1, x2 = paddle.split(data1, num_or_sections=3, dim=2)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([4, 6, 6]).astype('float64')
r0, r1, r2, = exe.run(feed={"data1": input1},
fetch_list=[x0, x1, x2])
ex_x0, ex_x1, ex_x2 = np.split(input1, 3, axis=2)
self.assertTrue(np.allclose(ex_x0, r0))
self.assertTrue(np.allclose(ex_x1, r1))
self.assertTrue(np.allclose(ex_x2, r2))
class API_TestSplit3(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data = fluid.layers.data('data', shape=[-1, 10], dtype='float64')
x0, x1 = paddle.split(data, num_or_sections=(3, 7), dim=1)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([1, 10]).astype('float64')
r0, r1 = exe.run(feed={"data": input1}, fetch_list=[x0, x1])
ex_x0, ex_x1 = np.split(input1, (3, ), axis=1)
self.assertTrue(np.allclose(ex_x0, r0))
self.assertTrue(np.allclose(ex_x1, r1))
class API_TestSplit4(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data = fluid.layers.data('data', shape=[-1, 10], dtype='float64')
index = fluid.layers.data('index', shape=[1], dtype='int32')
x0, x1 = paddle.split(data, num_or_sections=(3, index), dim=1)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([1, 10]).astype('float64')
input2 = np.array([7]).astype('int32')
r0, r1 = exe.run(feed={"data": input1,
"index": input2},
fetch_list=[x0, x1])
ex_x0, ex_x1 = np.split(input1, (3, ), axis=1)
self.assertTrue(np.allclose(ex_x0, r0))
self.assertTrue(np.allclose(ex_x1, r1))
class API_TestDygraphSplit(unittest.TestCase):
def test_out(self):
with fluid.dygraph.guard():
input_1 = np.random.random([4, 6, 6]).astype("int32")
# input is a variable which shape is [4, 6, 6]
input = fluid.dygraph.to_variable(input_1)
x0, x1, x2 = paddle.split(input, num_or_sections=3, dim=1)
x0_out = x0.numpy()
x1_out = x1.numpy()
x2_out = x2.numpy()
ex_x0, ex_x1, ex_x2 = np.split(input_1, 3, axis=1)
self.assertTrue(np.allclose(ex_x0, x0_out))
self.assertTrue(np.allclose(ex_x1, x1_out))
self.assertTrue(np.allclose(ex_x2, x2_out))
if __name__ == '__main__':
unittest.main()

@ -18,7 +18,7 @@ import unittest
import numpy as np
import paddle.fluid as fluid
from paddle.fluid import compiler, Program, program_guard
import paddle
from op_test import OpTest
@ -85,5 +85,31 @@ class TestSqueezeOpError(unittest.TestCase):
self.assertRaises(TypeError, fluid.layers.squeeze, x3, axes=0)
class API_TestSqueeze(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data(
'data1', shape=[-1, 1, 10], dtype='float64')
result_squeeze = paddle.squeeze(data1, axes=[1])
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([5, 1, 10]).astype('float64')
result, = exe.run(feed={"data1": input1},
fetch_list=[result_squeeze])
expected_result = np.squeeze(input1, axis=1)
self.assertTrue(np.allclose(expected_result, result))
class API_TestDygraphSqueeze(unittest.TestCase):
def test_out(self):
with fluid.dygraph.guard():
input_1 = np.random.random([5, 1, 10]).astype("int32")
input = fluid.dygraph.to_variable(input_1)
output = paddle.squeeze(input, axes=[1])
out_np = output.numpy()
expected_out = np.squeeze(input_1, axis=1)
self.assertTrue(np.allclose(expected_out, out_np))
if __name__ == "__main__":
unittest.main()

@ -14,6 +14,7 @@
import numpy as np
import unittest
import paddle
import paddle.fluid as fluid
from op_test import OpTest
@ -125,5 +126,84 @@ class TestStackAPIWithLoDTensorArray(unittest.TestCase):
[self.x] * self.iter_num, axis=self.axis)))
class TestTensorStackAPIWithLoDTensorArray(unittest.TestCase):
"""
Test stack api when the input(x) is a LoDTensorArray.
"""
def setUp(self):
self.axis = 1
self.iter_num = 3
self.input_shape = [2, 3]
self.x = np.random.random(self.input_shape).astype("float32")
self.place = fluid.CUDAPlace(0) \
if fluid.is_compiled_with_cuda() else fluid.CPUPlace()
self.set_program()
def set_program(self):
self.program = fluid.Program()
with fluid.program_guard(self.program):
input = fluid.layers.assign(self.x)
tensor_array = fluid.layers.create_array(dtype='float32')
zero = fluid.layers.fill_constant(shape=[1], value=0, dtype="int64")
for i in range(self.iter_num):
fluid.layers.array_write(input, zero + i, tensor_array)
self.out_var = paddle.stack(tensor_array, axis=self.axis)
def test_case(self):
self.assertTrue(self.out_var.shape[self.axis] == -1)
exe = fluid.Executor(self.place)
res = exe.run(self.program, fetch_list=self.out_var)
self.assertTrue(
np.array_equal(
res[0], np.stack(
[self.x] * self.iter_num, axis=self.axis)))
class API_test(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data('data1', shape=[1, 2], dtype='float64')
data2 = fluid.layers.data('data2', shape=[1, 2], dtype='float64')
data3 = fluid.layers.data('data3', shape=[1, 2], dtype='float64')
result_stack = paddle.stack([data1, data2, data3], axis=0)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([1, 2]).astype('float64')
input2 = np.random.random([1, 2]).astype('float64')
input3 = np.random.random([1, 2]).astype('float64')
result, = exe.run(
feed={"data1": input1,
"data2": input2,
"data3": input3},
fetch_list=[result_stack])
expected_result = np.stack([input1, input2, input3], axis=0)
self.assertTrue(np.allclose(expected_result, result))
class API_DygraphTest(unittest.TestCase):
def test_out(self):
data1 = np.array([[1.0, 2.0]])
data2 = np.array([[3.0, 4.0]])
data3 = np.array([[5.0, 6.0]])
with fluid.dygraph.guard():
x1 = fluid.dygraph.to_variable(data1)
x2 = fluid.dygraph.to_variable(data2)
x3 = fluid.dygraph.to_variable(data3)
result = paddle.stack([x1, x2, x3], axis=0)
result_np = result.numpy()
expected_result = np.stack([data1, data2, data3], axis=0)
self.assertTrue(np.allclose(expected_result, result_np))
with fluid.dygraph.guard():
y1 = fluid.dygraph.to_variable(data1)
result = paddle.stack(y1, axis=0)
result_np_2 = result.numpy()
expected_result_2 = np.stack(data1, axis=0)
self.assertTrue(np.allclose(expected_result_2, result_np_2))
if __name__ == '__main__':
unittest.main()

@ -16,7 +16,8 @@ from __future__ import print_function
import unittest
import numpy as np
import paddle
import paddle.fluid as fluid
from op_test import OpTest
@ -76,5 +77,87 @@ class TestUnsqueezeOp4(TestUnsqueezeOp):
self.new_shape = (10, 1, 1, 2, 5, 1)
class API_TestUnsqueeze(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.layers.data('data1', shape=[-1, 10], dtype='float64')
result_squeeze = paddle.unsqueeze(data1, axes=[1])
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([5, 1, 10]).astype('float64')
input = np.squeeze(input1, axis=1)
result, = exe.run(feed={"data1": input},
fetch_list=[result_squeeze])
self.assertTrue(np.allclose(input1, result))
class TestUnsqueezeOpError(unittest.TestCase):
def test_errors(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
# The type of axis in split_op should be int or Variable.
def test_axes_type():
x6 = fluid.layers.data(
shape=[-1, 10], dtype='float16', name='x3')
paddle.unsqueeze(x6, axes=3.2)
self.assertRaises(TypeError, test_axes_type)
class API_TestUnsqueeze2(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.data('data1', shape=[-1, 10], dtype='float64')
data2 = fluid.data('data2', shape=[1], dtype='int32')
result_squeeze = paddle.unsqueeze(data1, axes=data2)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([5, 1, 10]).astype('float64')
input2 = np.array([1]).astype('int32')
input = np.squeeze(input1, axis=1)
result1, = exe.run(feed={"data1": input,
"data2": input2},
fetch_list=[result_squeeze])
self.assertTrue(np.allclose(input1, result1))
class API_TestUnsqueeze3(unittest.TestCase):
def test_out(self):
with fluid.program_guard(fluid.Program(), fluid.Program()):
data1 = fluid.data('data1', shape=[-1, 10], dtype='float64')
data2 = fluid.data('data2', shape=[1], dtype='int32')
result_squeeze = paddle.unsqueeze(data1, axes=[data2, 3])
place = fluid.CPUPlace()
exe = fluid.Executor(place)
input1 = np.random.random([5, 1, 10, 1]).astype('float64')
input2 = np.array([1]).astype('int32')
input = np.squeeze(input1)
result1, = exe.run(feed={"data1": input,
"data2": input2},
fetch_list=[result_squeeze])
self.assertTrue(np.allclose(input1, result1))
class API_TestDyUnsqueeze(unittest.TestCase):
def test_out(self):
with fluid.dygraph.guard():
input_1 = np.random.random([5, 1, 10]).astype("int32")
input1 = np.squeeze(input_1, axis=1)
input = fluid.dygraph.to_variable(input_1)
output = paddle.unsqueeze(input, axes=[1])
out_np = output.numpy()
self.assertTrue(np.allclose(input1, out_np))
class API_TestDyUnsqueeze2(unittest.TestCase):
def test_out(self):
with fluid.dygraph.guard():
input_1 = np.random.random([5, 1, 10]).astype("int32")
input1 = np.squeeze(input_1, axis=1)
input = fluid.dygraph.to_variable(input_1)
output = paddle.unsqueeze(input, axes=1)
out_np = output.numpy()
self.assertTrue(np.allclose(input1, out_np))
if __name__ == "__main__":
unittest.main()

@ -145,7 +145,7 @@ from .linalg import bmm #DEFINE_ALIAS
# from .manipulation import expand #DEFINE_ALIAS
# from .manipulation import expand_as #DEFINE_ALIAS
# from .manipulation import flatten #DEFINE_ALIAS
# from .manipulation import gather #DEFINE_ALIAS
from .manipulation import gather #DEFINE_ALIAS
# from .manipulation import gather_nd #DEFINE_ALIAS
# from .manipulation import reshape #DEFINE_ALIAS
# from .manipulation import reverse #DEFINE_ALIAS
@ -154,14 +154,14 @@ from .linalg import bmm #DEFINE_ALIAS
# from .manipulation import scatter_nd #DEFINE_ALIAS
# from .manipulation import shard_index #DEFINE_ALIAS
# from .manipulation import slice #DEFINE_ALIAS
# from .manipulation import split #DEFINE_ALIAS
# from .manipulation import squeeze #DEFINE_ALIAS
# from .manipulation import stack #DEFINE_ALIAS
from .manipulation import split #DEFINE_ALIAS
from .manipulation import squeeze #DEFINE_ALIAS
from .manipulation import stack #DEFINE_ALIAS
# from .manipulation import strided_slice #DEFINE_ALIAS
# from .manipulation import transpose #DEFINE_ALIAS
# from .manipulation import unique #DEFINE_ALIAS
# from .manipulation import unique_with_counts #DEFINE_ALIAS
# from .manipulation import unsqueeze #DEFINE_ALIAS
from .manipulation import unsqueeze #DEFINE_ALIAS
# from .manipulation import unstack #DEFINE_ALIAS
from .manipulation import flip #DEFINE_ALIAS
# from .manipulation import unbind #DEFINE_ALIAS

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save