From 370b50f6d7e829e185ded3b0fbefdbfbece8dc8b Mon Sep 17 00:00:00 2001 From: seemingwang Date: Fri, 6 Jan 2023 14:11:54 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90Zero-Dim=E3=80=91Support=20Zero=20dim?= =?UTF-8?q?=20for=20embedding=20and=20one-hot=20(#49562)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * zero-tensor * remove unused * zero_dim_xpu * relocate * add value test * fix syntax --- paddle/phi/infermeta/unary.cc | 8 +-- .../tests/unittests/test_zero_dim_tensor.py | 51 +++++++++++++++++++ .../unittests/xpu/test_zero_dim_tensor_xpu.py | 18 +++++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/paddle/phi/infermeta/unary.cc b/paddle/phi/infermeta/unary.cc index f06fb612ee..b92b26f643 100644 --- a/paddle/phi/infermeta/unary.cc +++ b/paddle/phi/infermeta/unary.cc @@ -2257,8 +2257,8 @@ void OneHotRawInferMeta(const MetaTensor& x, auto x_dims = x.dims(); PADDLE_ENFORCE_GE( x_dims.size(), - 1, - phi::errors::InvalidArgument("Rank of Input(X) should be at least 1.")); + 0, + phi::errors::InvalidArgument("Rank of Input(X) should be at least 0.")); auto out_dims_vec = phi::vectorize(x_dims); out_dims_vec.push_back(depth.to()); auto out_dims = phi::make_ddim(out_dims_vec); @@ -2273,8 +2273,8 @@ void OneHotInferMeta(const MetaTensor& x, auto x_dims = x.dims(); PADDLE_ENFORCE_GE( x_dims.size(), - 1, - phi::errors::InvalidArgument("Rank of Input(X) should be at least 1.")); + 0, + phi::errors::InvalidArgument("Rank of Input(X) should be at least 0.")); int depth = depth_t.to(); auto out_dims_vec = phi::vectorize(x_dims); diff --git a/python/paddle/fluid/tests/unittests/test_zero_dim_tensor.py b/python/paddle/fluid/tests/unittests/test_zero_dim_tensor.py index 710480bfd9..d4ee3e5019 100644 --- a/python/paddle/fluid/tests/unittests/test_zero_dim_tensor.py +++ b/python/paddle/fluid/tests/unittests/test_zero_dim_tensor.py @@ -1421,6 +1421,24 @@ class TestNoBackwardAPI(unittest.TestCase): out = paddle.zeros(self.shape) self.assertEqual(out.shape, [2, 3, 4]) + def test_embedding(self): + ids = paddle.full(shape=[], fill_value=1, dtype='int64') + w0 = paddle.arange(3, 9).reshape((3, 2)).astype(paddle.float32) + w = paddle.to_tensor(w0, stop_gradient=False) + emb = paddle.nn.functional.embedding( + x=ids, weight=w, sparse=True, name="embedding" + ) + self.assertEqual(emb.shape, [2]) + res = [5.0, 6.0] + for i in range(len(res)): + self.assertEqual(emb.numpy()[i], res[i]) + + def test_one_hot_label(self): + label = paddle.full(shape=[], fill_value=2, dtype='int64') + one_hot_label = paddle.nn.functional.one_hot(label, num_classes=4) + self.assertEqual(one_hot_label.shape, [4]) + self.assertEqual(one_hot_label.numpy()[2], 1) + class TestNoBackwardAPIStatic(unittest.TestCase): def setUp(self): @@ -1590,6 +1608,39 @@ class TestNoBackwardAPIStatic(unittest.TestCase): self.assertEqual(res[1].shape, ()) self.assertEqual(res[2].shape, (2, 3, 4)) + def test_embedding(self): + ids = paddle.full(shape=[], fill_value=1, dtype='int64') + w0 = paddle.arange(3, 9).reshape((3, 2)).astype(paddle.float32) + w = paddle.to_tensor(w0, stop_gradient=False) + emb = paddle.nn.functional.embedding( + x=ids, weight=w, sparse=True, name="embedding" + ) + + prog = paddle.static.default_main_program() + res = self.exe.run(prog, fetch_list=[emb]) + self.assertEqual(res[0].shape, (2,)) + result = [5.0, 6.0] + for i in range(len(res)): + self.assertEqual(res[0][i], result[i]) + + def test_static_embedding(self): + ids = paddle.full(shape=[], fill_value=1, dtype='int64') + emb = paddle.static.nn.embedding(ids, (20, 3)) + prog = paddle.static.default_main_program() + self.exe.run(paddle.fluid.default_startup_program()) + res = self.exe.run(prog, fetch_list=[emb]) + self.assertEqual(res[0].shape, (3,)) + + def test_one_hot_label(self): + label = paddle.full(shape=[], fill_value=2, dtype='int64') + one_hot_label = paddle.nn.functional.one_hot(label, num_classes=4) + prog = paddle.static.default_main_program() + self.exe.run(paddle.fluid.default_startup_program()) + res = self.exe.run(prog, fetch_list=[one_hot_label]) + + self.assertEqual(res[0].shape, (4,)) + self.assertEqual(res[0][2], 1) + if __name__ == "__main__": unittest.main() diff --git a/python/paddle/fluid/tests/unittests/xpu/test_zero_dim_tensor_xpu.py b/python/paddle/fluid/tests/unittests/xpu/test_zero_dim_tensor_xpu.py index 95d56bb902..e7ed57cad4 100644 --- a/python/paddle/fluid/tests/unittests/xpu/test_zero_dim_tensor_xpu.py +++ b/python/paddle/fluid/tests/unittests/xpu/test_zero_dim_tensor_xpu.py @@ -833,6 +833,24 @@ class TestNoBackwardAPI(unittest.TestCase): out = paddle.zeros(self.shape) self.assertEqual(out.shape, [2, 3, 4]) + def test_embedding(self): + ids = paddle.full(shape=[], fill_value=1, dtype='int64') + w0 = paddle.arange(3, 9).reshape((3, 2)).astype(paddle.float32) + w = paddle.to_tensor(w0, stop_gradient=False) + emb = paddle.nn.functional.embedding( + x=ids, weight=w, sparse=True, name="embedding" + ) + self.assertEqual(emb.shape, [2]) + res = [5.0, 6.0] + for i in range(len(res)): + self.assertEqual(emb.numpy()[i], res[i]) + + def test_one_hot_label(self): + label = paddle.full(shape=[], fill_value=2, dtype='int64') + one_hot_label = paddle.nn.functional.one_hot(label, num_classes=4) + self.assertEqual(one_hot_label.shape, [4]) + self.assertEqual(one_hot_label.numpy()[2], 1) + if __name__ == "__main__": unittest.main() -- GitLab