未验证 提交 45711dad 编写于 作者: W WangXi 提交者: GitHub

【API】rename div to divide, add floor_divide, remainder (#26434)

上级 f5d13498
...@@ -25,14 +25,14 @@ class ElementwiseModOpMaker : public ElementwiseOpMaker { ...@@ -25,14 +25,14 @@ class ElementwiseModOpMaker : public ElementwiseOpMaker {
void AddInputX() override { void AddInputX() override {
AddInput("X", AddInput("X",
"(Variable), Tensor or LoDTensor of any dimensions. Its dtype " "(Tensor), Tensor of any dimensions. Its dtype "
"should be int32, int64."); "should be int32, int64, float32 or float64.");
} }
void AddInputY() override { void AddInputY() override {
AddInput("Y", AddInput("Y",
"(Variable), Tensor or LoDTensor of any dimensions. Its dtype " "(Tensor), Tensor of any dimensions. Its dtype "
"should be int32, int64."); "should be int32, int64, float32 or float64.");
} }
std::string GetOpFuntionality() const override { std::string GetOpFuntionality() const override {
......
...@@ -176,7 +176,11 @@ from .tensor.math import maximum #DEFINE_ALIAS ...@@ -176,7 +176,11 @@ from .tensor.math import maximum #DEFINE_ALIAS
from .tensor.math import min #DEFINE_ALIAS from .tensor.math import min #DEFINE_ALIAS
from .tensor.math import minimum #DEFINE_ALIAS from .tensor.math import minimum #DEFINE_ALIAS
from .tensor.math import mm #DEFINE_ALIAS from .tensor.math import mm #DEFINE_ALIAS
from .tensor.math import div #DEFINE_ALIAS from .tensor.math import divide #DEFINE_ALIAS
from .tensor.math import floor_divide #DEFINE_ALIAS
from .tensor.math import remainder #DEFINE_ALIAS
from .tensor.math import mod #DEFINE_ALIAS
from .tensor.math import floor_mod #DEFINE_ALIAS
from .tensor.math import multiply #DEFINE_ALIAS from .tensor.math import multiply #DEFINE_ALIAS
from .tensor.math import add #DEFINE_ALIAS from .tensor.math import add #DEFINE_ALIAS
from .tensor.math import atan #DEFINE_ALIAS from .tensor.math import atan #DEFINE_ALIAS
......
...@@ -11484,6 +11484,7 @@ Examples: ...@@ -11484,6 +11484,7 @@ Examples:
return _elementwise_op(LayerHelper('elementwise_add', **locals())) return _elementwise_op(LayerHelper('elementwise_add', **locals()))
@deprecated(since="2.0.0", update_to="paddle.divide")
def elementwise_div(x, y, axis=-1, act=None, name=None): def elementwise_div(x, y, axis=-1, act=None, name=None):
""" """
:alias_main: paddle.elementwise_div :alias_main: paddle.elementwise_div
...@@ -11907,6 +11908,7 @@ Examples: ...@@ -11907,6 +11908,7 @@ Examples:
return _elementwise_op(LayerHelper('elementwise_pow', **locals())) return _elementwise_op(LayerHelper('elementwise_pow', **locals()))
@deprecated(since="2.0.0", update_to="paddle.remainder")
def elementwise_mod(x, y, axis=-1, act=None, name=None): def elementwise_mod(x, y, axis=-1, act=None, name=None):
""" """
:alias_main: paddle.elementwise_mod :alias_main: paddle.elementwise_mod
...@@ -11944,6 +11946,7 @@ Examples: ...@@ -11944,6 +11946,7 @@ Examples:
return _elementwise_op(LayerHelper('elementwise_mod', **locals())) return _elementwise_op(LayerHelper('elementwise_mod', **locals()))
@deprecated(since="2.0.0", update_to="paddle.floor_divide")
def elementwise_floordiv(x, y, axis=-1, act=None, name=None): def elementwise_floordiv(x, y, axis=-1, act=None, name=None):
""" """
:alias_main: paddle.elementwise_floordiv :alias_main: paddle.elementwise_floordiv
......
...@@ -240,22 +240,22 @@ class TestElementwiseDivBroadcast(unittest.TestCase): ...@@ -240,22 +240,22 @@ class TestElementwiseDivBroadcast(unittest.TestCase):
self.assertEqual((out_result == (2 / x)).all(), True) self.assertEqual((out_result == (2 / x)).all(), True)
class TestDivOp(unittest.TestCase): class TestDivideOp(unittest.TestCase):
def test_name(self): def test_name(self):
with fluid.program_guard(fluid.Program()): with fluid.program_guard(fluid.Program()):
x = fluid.data(name="x", shape=[2, 3], dtype="float32") x = fluid.data(name="x", shape=[2, 3], dtype="float32")
y = fluid.data(name='y', shape=[2, 3], dtype='float32') y = fluid.data(name='y', shape=[2, 3], dtype='float32')
y_1 = paddle.div(x, y, name='div_res') y_1 = paddle.divide(x, y, name='div_res')
self.assertEqual(('div_res' in y_1.name), True) self.assertEqual(('div_res' in y_1.name), True)
def test_dygraph(self): def test_dygraph(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
np_x = np.array([2, 3, 4]).astype('float64') np_x = np.array([2, 3, 4]).astype('float64')
np_y = np.array([1, 5, 2]).astype('float64') np_y = np.array([1, 5, 2]).astype('float64')
x = fluid.dygraph.to_variable(np_x) x = paddle.to_tensor(np_x)
y = fluid.dygraph.to_variable(np_y) y = paddle.to_tensor(np_y)
z = paddle.div(x, y) z = paddle.divide(x, y)
np_z = z.numpy() np_z = z.numpy()
z_expected = np.array([2., 0.6, 2.]) z_expected = np.array([2., 0.6, 2.])
self.assertEqual((np_z == z_expected).all(), True) self.assertEqual((np_z == z_expected).all(), True)
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
from __future__ import print_function from __future__ import print_function
import unittest import unittest
import numpy as np import numpy as np
import paddle
import paddle.fluid as fluid
import paddle.fluid.core as core import paddle.fluid.core as core
from op_test import OpTest from op_test import OpTest
...@@ -65,5 +67,26 @@ class TestElementwiseModOp_scalar(TestElementwiseModOp): ...@@ -65,5 +67,26 @@ class TestElementwiseModOp_scalar(TestElementwiseModOp):
self.out = np.floor_divide(self.x, self.y) self.out = np.floor_divide(self.x, self.y)
class TestFloorDivideOp(unittest.TestCase):
def test_name(self):
with fluid.program_guard(fluid.Program()):
x = fluid.data(name="x", shape=[2, 3], dtype="int64")
y = fluid.data(name='y', shape=[2, 3], dtype='int64')
y_1 = paddle.floor_divide(x, y, name='div_res')
self.assertEqual(('div_res' in y_1.name), True)
def test_dygraph(self):
with fluid.dygraph.guard():
np_x = np.array([2, 3, 8, 7]).astype('int64')
np_y = np.array([1, 5, 3, 3]).astype('int64')
x = paddle.to_tensor(np_x)
y = paddle.to_tensor(np_y)
z = paddle.floor_divide(x, y)
np_z = z.numpy()
z_expected = np.array([2, 0, 2, 2])
self.assertEqual((np_z == z_expected).all(), True)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
from __future__ import print_function from __future__ import print_function
import unittest import unittest
import numpy as np import numpy as np
import paddle
import paddle.fluid as fluid
import paddle.fluid.core as core import paddle.fluid.core as core
from op_test import OpTest from op_test import OpTest
...@@ -82,5 +84,26 @@ class TestElementwiseModOpDouble(TestElementwiseModOpFloat): ...@@ -82,5 +84,26 @@ class TestElementwiseModOpDouble(TestElementwiseModOpFloat):
self.dtype = np.float64 self.dtype = np.float64
class TestRemainderOp(unittest.TestCase):
def test_name(self):
with fluid.program_guard(fluid.Program()):
x = fluid.data(name="x", shape=[2, 3], dtype="int64")
y = fluid.data(name='y', shape=[2, 3], dtype='int64')
y_1 = paddle.remainder(x, y, name='div_res')
self.assertEqual(('div_res' in y_1.name), True)
def test_dygraph(self):
with fluid.dygraph.guard():
np_x = np.array([2, 3, 8, 7]).astype('int64')
np_y = np.array([1, 5, 3, 3]).astype('int64')
x = paddle.to_tensor(np_x)
y = paddle.to_tensor(np_y)
z = paddle.remainder(x, y)
np_z = z.numpy()
z_expected = np.array([0, 3, 2, 1])
self.assertEqual((np_z == z_expected).all(), True)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -144,7 +144,11 @@ from .math import maximum #DEFINE_ALIAS ...@@ -144,7 +144,11 @@ from .math import maximum #DEFINE_ALIAS
from .math import min #DEFINE_ALIAS from .math import min #DEFINE_ALIAS
from .math import minimum #DEFINE_ALIAS from .math import minimum #DEFINE_ALIAS
from .math import mm #DEFINE_ALIAS from .math import mm #DEFINE_ALIAS
from .math import div #DEFINE_ALIAS from .math import divide #DEFINE_ALIAS
from .math import floor_divide #DEFINE_ALIAS
from .math import remainder #DEFINE_ALIAS
from .math import mod #DEFINE_ALIAS
from .math import floor_mod #DEFINE_ALIAS
from .math import multiply #DEFINE_ALIAS from .math import multiply #DEFINE_ALIAS
from .math import add #DEFINE_ALIAS from .math import add #DEFINE_ALIAS
from .math import atan #DEFINE_ALIAS from .math import atan #DEFINE_ALIAS
......
...@@ -111,7 +111,11 @@ __all__ = [ ...@@ -111,7 +111,11 @@ __all__ = [
'min', 'min',
'minimum', 'minimum',
'mm', 'mm',
'div', 'divide',
'floor_divide',
'remainder',
'mod',
'floor_mod',
'multiply', 'multiply',
'add', 'add',
'atan', 'atan',
...@@ -263,114 +267,143 @@ Examples: ...@@ -263,114 +267,143 @@ Examples:
return _elementwise_op(LayerHelper(op_type, **locals())) return _elementwise_op(LayerHelper(op_type, **locals()))
def div(x, y, name=None): def divide(x, y, name=None):
""" """
Examples: Divide two tensors element-wise. The equation is:
.. code-block:: python
import paddle
import paddle.fluid as fluid
import numpy as np
def gen_data(): .. math::
return { out = x / y
"x": np.array([2, 3, 4]).astype('float32'),
"y": np.array([1, 5, 2]).astype('float32')
}
x = fluid.data(name="x", shape=[3], dtype='float32') **Note**:
y = fluid.data(name="y", shape=[3], dtype='float32') ``paddle.divide`` supports broadcasting. If you want know more about broadcasting, please refer to :ref:`user_guide_broadcasting` .
z = paddle.div(x, y)
# z = x / y
place = fluid.CPUPlace() Args:
exe = fluid.Executor(place) x (Tensor): the input tensor, it's data type should be float32, float64, int32, int64.
z_value = exe.run(feed=gen_data(), y (Tensor): the input tensor, it's data type should be float32, float64, int32, int64.
fetch_list=[z.name]) name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
print(z_value) # [2., 0.6, 2.] Returns:
N-D Tensor. A location into which the result is stored. It's dimension equals with $x$.
Examples:
.. code-block:: python .. code-block:: python
import paddle import paddle
import paddle.fluid as fluid
import numpy as np import numpy as np
def gen_data(): paddle.disable_static()
return {
"x": np.ones((2, 3, 4, 5)).astype('float32'),
"y": np.zeros((4, 5)).astype('float32')
}
x = fluid.data(name="x", shape=[2, 3, 4, 5], dtype='float32') np_x = np.array([2, 3, 4]).astype('float64')
y = fluid.data(name="y", shape=[4, 5], dtype='float32') np_y = np.array([1, 5, 2]).astype('float64')
z = paddle.div(x, y, name='z') x = paddle.to_tensor(np_x)
# z = x / y y = paddle.to_tensor(np_y)
z = paddle.divide(x, y)
print(z.numpy()) # [2., 0.6, 2.]
"""
op_type = 'elementwise_div'
axis = -1
act = None
if in_dygraph_mode():
return _elementwise_op_in_dygraph(
x, y, axis=axis, act=act, op_name=op_type)
return _elementwise_op(LayerHelper(op_type, **locals()))
place = fluid.CPUPlace()
exe = fluid.Executor(place)
z_value = exe.run(feed=gen_data(), def floor_divide(x, y, name=None):
fetch_list=[z.name]) """
Floor divide two tensors element-wise. The equation is:
.. math::
out = x // y
**Note**:
``paddle.floor_divide`` supports broadcasting. If you want know more about broadcasting, please refer to :ref:`user_guide_broadcasting` .
Args:
x (Tensor): the input tensor, it's data type should be int32, int64.
y (Tensor): the input tensor, it's data type should be int32, int64.
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
print(z_value[0]) Returns:
print(z_value[0].shape) # z.shape=[2,3,4,5] N-D Tensor. A location into which the result is stored. It's dimension equals with $x$.
Examples:
.. code-block:: python .. code-block:: python
import paddle import paddle
import paddle.fluid as fluid
import numpy as np import numpy as np
def gen_data(): paddle.disable_static()
return {
"x": np.random.randint(1, 5, size=[2, 3, 4, 5]).astype('float32'),
"y": np.random.randint(1, 5, size=[5]).astype('float32')
}
x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32') np_x = np.array([2, 3, 8, 7])
y = fluid.data(name="y", shape=[5], dtype='float32') np_y = np.array([1, 5, 3, 3])
z = paddle.div(x, y) x = paddle.to_tensor(np_x)
# z = x / y y = paddle.to_tensor(np_y)
z = paddle.floor_divide(x, y)
print(z.numpy()) # [2, 0, 2, 2]
place = fluid.CPUPlace() """
exe = fluid.Executor(place) op_type = 'elementwise_floordiv'
axis = -1
if in_dygraph_mode():
return _elementwise_op_in_dygraph(
x, y, axis=axis, op_name=op_type)
z_value = exe.run(feed=gen_data(), return _elementwise_op(LayerHelper(op_type, **locals()))
fetch_list=[z.name])
print(z_value[0])
print(z_value[0].shape) # z.shape=[2,3,4,5]
def remainder(x, y, name=None):
"""
Mod two tensors element-wise. The equation is:
.. math::
out = x \% y
**Note**:
``paddle.remainder`` supports broadcasting. If you want know more about broadcasting, please refer to :ref:`user_guide_broadcasting` .
Args:
x (Tensor): the input tensor, it's data type should be int32, int64.
y (Tensor): the input tensor, it's data type should be int32, int64.
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
Returns:
N-D Tensor. A location into which the result is stored. It's dimension equals with $x$.
Examples:
.. code-block:: python .. code-block:: python
import paddle import paddle
import paddle.fluid as fluid
import numpy as np import numpy as np
with fluid.dygraph.guard(fluid.CPUPlace()): paddle.disable_static()
np_x = np.array([2, 3, 4]).astype('float64')
np_y = np.array([1, 5, 2]).astype('float64') np_x = np.array([2, 3, 8, 7])
x = fluid.dygraph.to_variable(np_x) np_y = np.array([1, 5, 3, 3])
y = fluid.dygraph.to_variable(np_y) x = paddle.to_tensor(np_x)
z = paddle.div(x, y) y = paddle.to_tensor(np_y)
np_z = z.numpy() z = paddle.remainder(x, y)
print(np_z) # [2., 0.6, 2.] print(z.numpy()) # [0, 3, 2, 1]
""" """
op_type = 'elementwise_div' op_type = 'elementwise_mod'
axis = -1 axis = -1
act = None
if in_dygraph_mode(): if in_dygraph_mode():
return _elementwise_op_in_dygraph( return _elementwise_op_in_dygraph(
x, y, axis=axis, act=act, op_name=op_type) x, y, axis=axis, op_name=op_type)
return _elementwise_op(LayerHelper(op_type, **locals())) return _elementwise_op(LayerHelper(op_type, **locals()))
mod = remainder #DEFINE_ALIAS
floor_mod = remainder #DEFINE_ALIAS
def multiply(x, y, axis=-1, name=None): def multiply(x, y, axis=-1, name=None):
""" """
:alias_main: paddle.multiply :alias_main: paddle.multiply
...@@ -512,7 +545,6 @@ Examples: ...@@ -512,7 +545,6 @@ Examples:
for func in [ for func in [
add, add,
div,
maximum, maximum,
minimum, minimum,
multiply multiply
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册