未验证 提交 0ca10d31 编写于 作者: S ShenLiang 提交者: GitHub

add paddle.static.data (#26525)

* add static data
上级 81c127d4
...@@ -18,10 +18,12 @@ import six ...@@ -18,10 +18,12 @@ import six
from paddle.fluid import core from paddle.fluid import core
from paddle.fluid.layer_helper import LayerHelper from paddle.fluid.layer_helper import LayerHelper
from paddle.fluid.data_feeder import check_dtype, check_type from paddle.fluid.data_feeder import check_dtype, check_type
from ..utils import deprecated
__all__ = ['data'] __all__ = ['data']
@deprecated(since="2.0.0", update_to="paddle.static.data")
def data(name, shape, dtype='float32', lod_level=0): def data(name, shape, dtype='float32', lod_level=0):
""" """
**Data Layer** **Data Layer**
......
...@@ -8353,6 +8353,7 @@ def gather_nd(input, index, name=None): ...@@ -8353,6 +8353,7 @@ def gather_nd(input, index, name=None):
return output return output
@deprecated(since="2.0.0", update_to="paddle.scatter")
def scatter(input, index, updates, name=None, overwrite=True): def scatter(input, index, updates, name=None, overwrite=True):
""" """
:alias_main: paddle.scatter :alias_main: paddle.scatter
......
...@@ -16,9 +16,11 @@ from __future__ import print_function ...@@ -16,9 +16,11 @@ from __future__ import print_function
import unittest import unittest
import paddle
import paddle.fluid as fluid import paddle.fluid as fluid
import paddle.fluid.layers as layers import paddle.fluid.layers as layers
from paddle.fluid import Program, program_guard from paddle.fluid import Program, program_guard
import paddle.fluid.core as core
class TestApiDataError(unittest.TestCase): class TestApiDataError(unittest.TestCase):
...@@ -53,5 +55,49 @@ class TestApiDataError(unittest.TestCase): ...@@ -53,5 +55,49 @@ class TestApiDataError(unittest.TestCase):
self.assertRaises(TypeError, test_shape_type) self.assertRaises(TypeError, test_shape_type)
class TestApiStaticDataError(unittest.TestCase):
def test_fluid_dtype(self):
with program_guard(Program(), Program()):
x1 = paddle.static.data(name="x1", shape=[2, 25])
self.assertEqual(x1.dtype, core.VarDesc.VarType.FP32)
x2 = paddle.static.data(name="x2", shape=[2, 25], dtype="bool")
self.assertEqual(x2.dtype, core.VarDesc.VarType.BOOL)
paddle.set_default_dtype("float64")
x3 = paddle.static.data(name="x3", shape=[2, 25])
self.assertEqual(x3.dtype, core.VarDesc.VarType.FP64)
def test_fluid_data(self):
with program_guard(Program(), Program()):
# 1. The type of 'name' in fluid.data must be str.
def test_name_type():
paddle.static.data(name=1, shape=[2, 25], dtype="bool")
self.assertRaises(TypeError, test_name_type)
# 2. The type of 'shape' in fluid.data must be list or tuple.
def test_shape_type():
paddle.static.data(name='data1', shape=2, dtype="bool")
self.assertRaises(TypeError, test_shape_type)
def test_layers_data(self):
with program_guard(Program(), Program()):
# 1. The type of 'name' in layers.data must be str.
def test_name_type():
paddle.static.data(name=1, shape=[2, 25], dtype="bool")
self.assertRaises(TypeError, test_name_type)
# 2. The type of 'shape' in layers.data must be list or tuple.
def test_shape_type():
paddle.static.data(name='data1', shape=2, dtype="bool")
self.assertRaises(TypeError, test_shape_type)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
...@@ -12,11 +12,112 @@ ...@@ -12,11 +12,112 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from ..fluid.data import data import paddle
import numpy as np
import six
from paddle.fluid import core
from paddle.fluid.layer_helper import LayerHelper
from paddle.fluid.data_feeder import check_dtype, check_type
__all__ = ['data', 'InputSpec'] __all__ = ['data', 'InputSpec']
def data(name, shape, dtype=None, lod_level=0):
"""
**Data Layer**
This function creates a variable on the global block. The global variable
can be accessed by all the following operators in the graph. The variable
is a placeholder that could be fed with input, such as Executor can feed
input into the variable. When `dtype` is None, the dtype
will get from the global dtype by `paddle.get_default_dtype()`.
Args:
name (str): The name/alias of the variable, see :ref:`api_guide_Name`
for more details.
shape (list|tuple): List|Tuple of integers declaring the shape. You can
set "None" or -1 at a dimension to indicate the dimension can be of any
size. For example, it is useful to set changeable batch size as "None" or -1.
dtype (np.dtype|str, optional): The type of the data. Supported
dtype: bool, float16, float32, float64, int8, int16, int32, int64,
uint8. Default: None. When `dtype` is not set, the dtype will get
from the global dtype by `paddle.get_default_dtype()`.
lod_level (int, optional): The LoD level of the LoDTensor. Usually users
don't have to set this value. For more details about when and how to
use LoD level, see :ref:`user_guide_lod_tensor` . Default: 0.
Returns:
Variable: The global variable that gives access to the data.
Examples:
.. code-block:: python
import numpy as np
import paddle.fluid as fluid
import paddle
# Creates a variable with fixed size [3, 2, 1]
# User can only feed data of the same shape to x
# the dtype is not set, so it will set "float32" by
# paddle.get_default_dtype(). You can use paddle.get_default_dtype() to
# change the global dtype
x = paddle.static.data(name='x', shape=[3, 2, 1])
# Creates a variable with changeable batch size -1.
# Users can feed data of any batch size into y,
# but size of each data sample has to be [2, 1]
y = paddle.static.data(name='y', shape=[-1, 2, 1], dtype='float32')
z = x + y
# In this example, we will feed x and y with np-ndarray "1"
# and fetch z, like implementing "1 + 1 = 2" in PaddlePaddle
feed_data = np.ones(shape=[3, 2, 1], dtype=np.float32)
exe = fluid.Executor(fluid.CPUPlace())
out = exe.run(fluid.default_main_program(),
feed={
'x': feed_data,
'y': feed_data
},
fetch_list=[z.name])
# np-ndarray of shape=[3, 2, 1], dtype=float32, whose elements are 2
print(out)
"""
helper = LayerHelper('data', **locals())
check_type(name, 'name', (six.binary_type, six.text_type), 'data')
check_type(shape, 'shape', (list, tuple), 'data')
shape = list(shape)
for i in six.moves.range(len(shape)):
if shape[i] is None:
shape[i] = -1
if dtype:
return helper.create_global_variable(
name=name,
shape=shape,
dtype=dtype,
type=core.VarDesc.VarType.LOD_TENSOR,
stop_gradient=True,
lod_level=lod_level,
is_data=True,
need_check_feed=True)
else:
return helper.create_global_variable(
name=name,
shape=shape,
dtype=paddle.get_default_dtype(),
type=core.VarDesc.VarType.LOD_TENSOR,
stop_gradient=True,
lod_level=lod_level,
is_data=True,
need_check_feed=True)
class InputSpec(object): class InputSpec(object):
""" """
Define input specification of the model. Define input specification of the model.
...@@ -28,7 +129,7 @@ class InputSpec(object): ...@@ -28,7 +129,7 @@ class InputSpec(object):
declaring the shape. You can set "None" or -1 at a dimension declaring the shape. You can set "None" or -1 at a dimension
to indicate the dimension can be of any size. For example, to indicate the dimension can be of any size. For example,
it is useful to set changeable batch size as "None" or -1. it is useful to set changeable batch size as "None" or -1.
dtype (np.dtype|VarType|str, optional): The type of the data. Supported dtype (np.dtype|str, optional): The type of the data. Supported
dtype: bool, float16, float32, float64, int8, int16, int32, int64, dtype: bool, float16, float32, float64, int8, int16, int32, int64,
uint8. Default: float32. uint8. Default: float32.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册