Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
30dda5a7
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
30dda5a7
编写于
10月 15, 2019
作者:
L
liym27
提交者:
Aurelius84
10月 15, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[cherry-pick] add fill_constant input(shape) dtype check. (#20620) (#20623)
test=release/1.6
上级
1822f86e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
79 addition
and
20 deletion
+79
-20
paddle/fluid/API.spec
paddle/fluid/API.spec
+1
-1
python/paddle/fluid/layers/tensor.py
python/paddle/fluid/layers/tensor.py
+31
-5
python/paddle/fluid/tests/unittests/test_fill_constant_op.py
python/paddle/fluid/tests/unittests/test_fill_constant_op.py
+47
-14
未找到文件。
paddle/fluid/API.spec
浏览文件 @
30dda5a7
...
...
@@ -326,7 +326,7 @@ paddle.fluid.layers.concat (ArgSpec(args=['input', 'axis', 'name'], varargs=None
paddle.fluid.layers.sums (ArgSpec(args=['input', 'out'], varargs=None, keywords=None, defaults=(None,)), ('document', '191164436efbc1b7bccc4190a88e7de2'))
paddle.fluid.layers.assign (ArgSpec(args=['input', 'output'], varargs=None, keywords=None, defaults=(None,)), ('document', '98ce6e7c3659b8377c04cecfc72c2000'))
paddle.fluid.layers.fill_constant_batch_size_like (ArgSpec(args=['input', 'shape', 'dtype', 'value', 'input_dim_idx', 'output_dim_idx', 'force_cpu'], varargs=None, keywords=None, defaults=(0, 0, False)), ('document', '2bb57637664173fee5f654e55896aec6'))
paddle.fluid.layers.fill_constant (ArgSpec(args=['shape', 'dtype', 'value', 'force_cpu', 'out'], varargs=None, keywords=None, defaults=(False, None)), ('document', '
66e1e468666dd47e5b2715226cebeac0
'))
paddle.fluid.layers.fill_constant (ArgSpec(args=['shape', 'dtype', 'value', 'force_cpu', 'out'], varargs=None, keywords=None, defaults=(False, None)), ('document', '
fa349c956a3e44297caf07a376eedaad
'))
paddle.fluid.layers.argmin (ArgSpec(args=['x', 'axis'], varargs=None, keywords=None, defaults=(0,)), ('document', '53629e27597e5dfb7020aac5bc639ebb'))
paddle.fluid.layers.argmax (ArgSpec(args=['x', 'axis'], varargs=None, keywords=None, defaults=(0,)), ('document', 'd9a89fbedbaebd5f65897ac75ee636f3'))
paddle.fluid.layers.argsort (ArgSpec(args=['input', 'axis', 'name'], varargs=None, keywords=None, defaults=(-1, None)), ('document', '8c7966eb4b37b2272a16717cac3a876c'))
...
...
python/paddle/fluid/layers/tensor.py
浏览文件 @
30dda5a7
...
...
@@ -524,7 +524,10 @@ def fill_constant(shape, dtype, value, force_cpu=False, out=None):
The attribute `stop_gradient` of the created Tensor is setted to True.
Args:
shape(tuple|list): Shape of the Tensor to be created.
shape(list|tuple|Variable): Shape of the Tensor to be created.
The data type is ``int32`` or ``int64`` . If ``shape`` is a list or tuple,
the elements of it should be integers or Tensors with shape [1].
If ``shape`` is an Variable, it should be an 1-D Tensor .
dtype(np.dtype|core.VarDesc.VarType|str): Data type of the output tensor which can
be float16, float32, float64, int32, int64.
value(float): The constant value used to initialize the Tensor to be created.
...
...
@@ -544,9 +547,18 @@ def fill_constant(shape, dtype, value, force_cpu=False, out=None):
.. code-block:: python
import paddle.fluid as fluid
data1 = fluid.layers.fill_constant(shape=[2,1], value=0, dtype='int64') #data1=[[0],[0]]
data2 = fluid.layers.fill_constant(shape=[2,1], value=5, dtype='int64', out=data1)
#data1=[[5], [5]] data2=[[5], [5]]
# attr shape is a list which doesn't contain Variable Tensor.
data1 = fluid.layers.fill_constant(shape=[2,1], value=0, dtype='int64') # data1=[[0],[0]]
data2 = fluid.layers.fill_constant(shape=[2,1], value=5, dtype='int64', out=data1)
# data1=[[0], [0]] data2=[[5], [5]]
# attr shape is a list which contains Variable Tensor.
positive_2 = fluid.layers.fill_constant([1], "int32", 2)
data3 = fluid.layers.fill_constant(shape=[1, positive_2], dtype='float32', value=1.5) # data3=[1.5, 1.5]
# attr shape is an Variable Tensor.
shape = fluid.layers.fill_constant([1,2], "int32", 2) # shape=[2,2]
data4 = fluid.layers.fill_constant(shape=shape, dtype='bool', value=True) # data4=[[True,True],[True,True]]
"""
helper
=
LayerHelper
(
"fill_constant"
,
**
locals
())
if
convert_dtype
(
dtype
)
not
in
[
...
...
@@ -585,9 +597,17 @@ def fill_constant(shape, dtype, value, force_cpu=False, out=None):
def
_get_shape_tensor
(
list_shape
):
new_shape_tensor
=
[]
for
dim
in
list_shape
:
for
idx
,
dim
in
enumerate
(
list_shape
)
:
if
isinstance
(
dim
,
Variable
):
dim
.
stop_gradient
=
True
if
convert_dtype
(
dim
.
dtype
)
not
in
[
'int32'
,
'int64'
]:
raise
TypeError
(
"When type of 'shape' in fill_constant is list or tuple, "
"the data type of the element with type Variable must be int32 or int64, "
"but received the data type of shape[%d] is %s."
%
(
idx
,
convert_dtype
(
dim
.
dtype
)))
if
convert_dtype
(
dim
.
dtype
)
==
'int64'
:
dim
=
cast
(
x
=
dim
,
dtype
=
'int32'
)
new_shape_tensor
.
append
(
dim
)
else
:
temp_out
=
helper
.
create_variable_for_type_inference
(
'int32'
)
...
...
@@ -597,6 +617,12 @@ def fill_constant(shape, dtype, value, force_cpu=False, out=None):
if
isinstance
(
shape
,
Variable
):
shape
.
stop_gradient
=
True
if
convert_dtype
(
shape
.
dtype
)
not
in
[
'int32'
,
'int64'
]:
raise
TypeError
(
"When type of 'shape' in fill_constant is Variable, the data type of 'shape' must be int32 or int64, "
"but received %s."
%
(
convert_dtype
(
shape
.
dtype
)))
if
(
convert_dtype
(
shape
.
dtype
)
==
'int64'
):
shape
=
cast
(
shape
,
'int32'
)
inputs
[
"ShapeTensor"
]
=
shape
elif
isinstance
(
shape
,
(
list
,
tuple
)):
assert
len
(
shape
)
>
0
,
(
...
...
python/paddle/fluid/tests/unittests/test_fill_constant_op.py
浏览文件 @
30dda5a7
...
...
@@ -189,33 +189,47 @@ class TestFillConstantOp1_ShapeTensor(OpTest):
self
.
check_output
()
#
#
Test python API
# Test python API
class
TestFillConstantAPI
(
OpTest
):
def
test_api
(
self
):
positive_2
=
fluid
.
layers
.
fill_constant
([
1
],
"int32"
,
2
)
shape_tensor
=
fluid
.
layers
.
data
(
name
=
"shape_tensor"
,
shape
=
[
2
],
append_batch_size
=
False
,
dtype
=
"int32"
)
positive_2_int32
=
fluid
.
layers
.
fill_constant
([
1
],
"int32"
,
2
)
positive_2_int64
=
fluid
.
layers
.
fill_constant
([
1
],
"int64"
,
2
)
shape_tensor_int32
=
fluid
.
data
(
name
=
"shape_tensor_int32"
,
shape
=
[
2
],
dtype
=
"int32"
)
shape_tensor_int64
=
fluid
.
data
(
name
=
"shape_tensor_int64"
,
shape
=
[
2
],
dtype
=
"int64"
)
out_1
=
fluid
.
layers
.
fill_constant
(
shape
=
[
1
,
2
],
dtype
=
"float32"
,
value
=
1.1
)
out_2
=
fluid
.
layers
.
fill_constant
(
shape
=
[
1
,
positive_2
],
dtype
=
"float32"
,
value
=
1.1
)
shape
=
[
1
,
positive_2
_int32
],
dtype
=
"float32"
,
value
=
1.1
)
out_3
=
fluid
.
layers
.
fill_constant
(
shape
=
shape_tensor
,
dtype
=
"float32"
,
value
=
1.1
)
shape
=
[
1
,
positive_2_int64
],
dtype
=
"float32"
,
value
=
1.1
)
out_4
=
fluid
.
layers
.
fill_constant
(
shape
=
shape_tensor_int32
,
dtype
=
"float32"
,
value
=
1.1
)
out_5
=
fluid
.
layers
.
fill_constant
(
shape
=
shape_tensor_int64
,
dtype
=
"float32"
,
value
=
1.1
)
exe
=
fluid
.
Executor
(
place
=
fluid
.
CPUPlace
())
res_1
,
res_2
,
res_3
=
exe
.
run
(
res_1
,
res_2
,
res_3
,
res_4
,
res_5
=
exe
.
run
(
fluid
.
default_main_program
(),
feed
=
{
"shape_tensor"
:
np
.
array
([
1
,
2
]).
astype
(
"int32"
)},
fetch_list
=
[
out_1
,
out_2
,
out_3
])
feed
=
{
"shape_tensor_int32"
:
np
.
array
([
1
,
2
]).
astype
(
"int32"
),
"shape_tensor_int64"
:
np
.
array
([
1
,
2
]).
astype
(
"int64"
),
},
fetch_list
=
[
out_1
,
out_2
,
out_3
,
out_4
,
out_5
])
assert
np
.
array_equal
(
res_1
,
np
.
full
([
1
,
2
],
1.1
,
dtype
=
"float32"
))
assert
np
.
array_equal
(
res_2
,
np
.
full
([
1
,
2
],
1.1
,
dtype
=
"float32"
))
assert
np
.
array_equal
(
res_3
,
np
.
full
([
1
,
2
],
1.1
,
dtype
=
"float32"
))
assert
np
.
array_equal
(
res_4
,
np
.
full
([
1
,
2
],
1.1
,
dtype
=
"float32"
))
assert
np
.
array_equal
(
res_5
,
np
.
full
([
1
,
2
],
1.1
,
dtype
=
"float32"
))
class
TestFillConstantOpError
(
OpTest
):
...
...
@@ -236,7 +250,8 @@ class TestFillConstantOpError(OpTest):
value
=
5
,
dtype
=
'int16'
,
out
=
x1
)
# The input dtype of fill_constant must be one of bool, float16,
# The argument dtype of fill_constant_op must be one of bool, float16,
#float32, float64, int32 or int64
x2
=
fluid
.
layers
.
data
(
name
=
'x2'
,
shape
=
[
1
],
dtype
=
"int32"
)
...
...
@@ -254,17 +269,35 @@ class TestFillConstantOpError(OpTest):
dtype
=
'float64'
,
out
=
x2
)
#
test Error of Shape
#
The argument shape's type of fill_constant_op must be list, tuple or Variable.
def
test_shape_type
():
fluid
.
layers
.
fill_constant
(
shape
=
1
,
dtype
=
"float32"
,
value
=
1
)
self
.
assertRaises
(
TypeError
,
test_shape_type
)
# The argument shape's size of fill_constant_op must not be 0.
def
test_shape_size
():
fluid
.
layers
.
fill_constant
(
shape
=
[],
dtype
=
"float32"
,
value
=
1
)
self
.
assertRaises
(
AssertionError
,
test_shape_size
)
# The shape dtype of fill_constant_op must be int32 or int64.
def
test_shape_tensor_dtype
():
shape
=
fluid
.
data
(
name
=
"shape_tensor"
,
shape
=
[
2
],
dtype
=
"float32"
)
fluid
.
layers
.
fill_constant
(
shape
=
shape
,
dtype
=
"float32"
,
value
=
1
)
self
.
assertRaises
(
TypeError
,
test_shape_tensor_dtype
)
def
test_shape_tensor_list_dtype
():
shape
=
fluid
.
data
(
name
=
"shape_tensor_list"
,
shape
=
[
1
],
dtype
=
"bool"
)
fluid
.
layers
.
fill_constant
(
shape
=
[
shape
,
2
],
dtype
=
"float32"
,
value
=
1
)
self
.
assertRaises
(
TypeError
,
test_shape_tensor_list_dtype
)
if
__name__
==
"__main__"
:
unittest
.
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录