Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
5d718a58
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看板
提交
5d718a58
编写于
7月 22, 2018
作者:
Q
qiaolongfei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
optimize reduce_sum_grad op
上级
b643473d
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
56 addition
and
23 deletion
+56
-23
paddle/fluid/operators/reduce_op.h
paddle/fluid/operators/reduce_op.h
+29
-0
paddle/fluid/operators/reduce_sum_op.h
paddle/fluid/operators/reduce_sum_op.h
+1
-1
python/paddle/fluid/layers/nn.py
python/paddle/fluid/layers/nn.py
+2
-2
python/paddle/fluid/tests/unittests/test_reduce_op.py
python/paddle/fluid/tests/unittests/test_reduce_op.py
+24
-20
未找到文件。
paddle/fluid/operators/reduce_op.h
浏览文件 @
5d718a58
...
@@ -88,6 +88,35 @@ class ReduceGradKernel : public framework::OpKernel<T> {
...
@@ -88,6 +88,35 @@ class ReduceGradKernel : public framework::OpKernel<T> {
auto
*
output
=
context
.
Output
<
Tensor
>
(
framework
::
GradVarName
(
"X"
));
auto
*
output
=
context
.
Output
<
Tensor
>
(
framework
::
GradVarName
(
"X"
));
output
->
mutable_data
<
T
>
(
context
.
GetPlace
());
output
->
mutable_data
<
T
>
(
context
.
GetPlace
());
if
(
context
.
GetPlace
().
type
()
==
typeid
(
platform
::
CPUPlace
))
{
const
auto
*
input2_d
=
input2
->
data
<
T
>
();
auto
*
output_d
=
output
->
data
<
T
>
();
// CPU reduce_all_grad
if
(
reduce_all
)
{
PADDLE_ENFORCE
(
input2
->
dims
().
size
()
==
1
&&
input2
->
dims
()[
0
]
==
1
,
"output should be a scalar"
);
for
(
int64_t
i
=
0
;
i
<
framework
::
product
(
input0
->
dims
());
++
i
)
{
output_d
[
i
]
=
input2_d
[
0
];
}
return
;
}
if
(
input0
->
dims
().
size
()
==
2
&&
dims
.
size
()
==
1
)
{
auto
&
input_dim
=
input0
->
dims
();
for
(
int64_t
i
=
0
;
i
<
input_dim
[
0
];
++
i
)
{
for
(
int64_t
j
=
0
;
j
<
input_dim
[
1
];
++
j
)
{
if
(
dims
[
0
]
==
0
)
{
output_d
[
i
*
input_dim
[
1
]
+
j
]
=
input2_d
[
j
];
}
else
{
output_d
[
i
*
input_dim
[
1
]
+
j
]
=
input2_d
[
i
];
}
}
}
return
;
}
}
if
(
reduce_all
)
{
if
(
reduce_all
)
{
auto
x
=
EigenVector
<
T
>::
Flatten
(
*
input0
);
auto
x
=
EigenVector
<
T
>::
Flatten
(
*
input0
);
auto
x_reduce
=
EigenVector
<
T
>::
From
(
*
input1
);
auto
x_reduce
=
EigenVector
<
T
>::
From
(
*
input1
);
...
...
paddle/fluid/operators/reduce_sum_op.h
浏览文件 @
5d718a58
...
@@ -31,7 +31,7 @@ struct SumGradFunctor {
...
@@ -31,7 +31,7 @@ struct SumGradFunctor {
typename
DY
,
typename
Dim
>
typename
DY
,
typename
Dim
>
void
operator
()(
const
DeviceContext
&
place
,
X
*
x
,
Y
*
y
,
DX
*
dx
,
DY
*
dy
,
void
operator
()(
const
DeviceContext
&
place
,
X
*
x
,
Y
*
y
,
DX
*
dx
,
DY
*
dy
,
const
Dim
&
dim
,
int
size
)
{
const
Dim
&
dim
,
int
size
)
{
dx
->
device
(
place
)
=
dy
->
broadcast
(
dim
);
dx
->
device
(
place
)
=
dy
->
eval
().
broadcast
(
dim
);
}
}
};
};
...
...
python/paddle/fluid/layers/nn.py
浏览文件 @
5d718a58
...
@@ -2961,7 +2961,7 @@ def reduce_sum(input, dim=None, keep_dim=False, name=None):
...
@@ -2961,7 +2961,7 @@ def reduce_sum(input, dim=None, keep_dim=False, name=None):
# x is a Tensor variable with following elements:
# x is a Tensor variable with following elements:
# [[0.2, 0.3, 0.5, 0.9]
# [[0.2, 0.3, 0.5, 0.9]
# [0.1, 0.2, 0.6, 0.7]]
# [0.1, 0.2, 0.6, 0.7]]
# Each example is followed by the corresp
e
nding output tensor.
# Each example is followed by the corresp
o
nding output tensor.
fluid.layers.reduce_sum(x) # [3.5]
fluid.layers.reduce_sum(x) # [3.5]
fluid.layers.reduce_sum(x, dim=0) # [0.3, 0.5, 1.1, 1.6]
fluid.layers.reduce_sum(x, dim=0) # [0.3, 0.5, 1.1, 1.6]
fluid.layers.reduce_sum(x, dim=-1) # [1.9, 1.6]
fluid.layers.reduce_sum(x, dim=-1) # [1.9, 1.6]
...
@@ -2970,7 +2970,7 @@ def reduce_sum(input, dim=None, keep_dim=False, name=None):
...
@@ -2970,7 +2970,7 @@ def reduce_sum(input, dim=None, keep_dim=False, name=None):
# x is a Tensor variable with shape [2, 2, 2] and elements as below:
# x is a Tensor variable with shape [2, 2, 2] and elements as below:
# [[[1, 2], [3, 4]],
# [[[1, 2], [3, 4]],
# [[5, 6], [7, 8]]]
# [[5, 6], [7, 8]]]
# Each example is followed by the corresp
e
nding output tensor.
# Each example is followed by the corresp
o
nding output tensor.
fluid.layers.reduce_sum(x, dim=[1, 2]) # [10, 26]
fluid.layers.reduce_sum(x, dim=[1, 2]) # [10, 26]
fluid.layers.reduce_sum(x, dim=[0, 1]) # [16, 20]
fluid.layers.reduce_sum(x, dim=[0, 1]) # [16, 20]
...
...
python/paddle/fluid/tests/unittests/test_reduce_op.py
浏览文件 @
5d718a58
...
@@ -89,15 +89,11 @@ class TestProdOp(OpTest):
...
@@ -89,15 +89,11 @@ class TestProdOp(OpTest):
self
.
check_grad
([
'X'
],
'Out'
)
self
.
check_grad
([
'X'
],
'Out'
)
class
Test
KeepDim
Reduce
(
OpTest
):
class
Test
1D
Reduce
(
OpTest
):
def
setUp
(
self
):
def
setUp
(
self
):
self
.
op_type
=
"reduce_sum"
self
.
op_type
=
"reduce_sum"
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
5
,
6
,
10
)).
astype
(
"float64"
)}
self
.
inputs
=
{
'X'
:
np
.
random
.
random
(
20
).
astype
(
"float64"
)}
self
.
attrs
=
{
'dim'
:
[
-
2
],
'keep_dim'
:
True
}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
0
)}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
tuple
(
self
.
attrs
[
'dim'
]),
keepdims
=
True
)
}
def
test_check_output
(
self
):
def
test_check_output
(
self
):
self
.
check_output
()
self
.
check_output
()
...
@@ -106,32 +102,40 @@ class TestKeepDimReduce(OpTest):
...
@@ -106,32 +102,40 @@ class TestKeepDimReduce(OpTest):
self
.
check_grad
([
'X'
],
'Out'
)
self
.
check_grad
([
'X'
],
'Out'
)
class
Test
1DReduce
(
OpTest
):
class
Test
2DReduce0
(
Test1DReduce
):
def
setUp
(
self
):
def
setUp
(
self
):
self
.
op_type
=
"reduce_sum"
self
.
op_type
=
"reduce_sum"
self
.
inputs
=
{
'X'
:
np
.
random
.
random
(
20
).
astype
(
"float64"
)}
self
.
attrs
=
{
'dim'
:
[
0
]}
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
20
,
10
)).
astype
(
"float64"
)}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
0
)}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
0
)}
def
test_check_output
(
self
):
self
.
check_output
()
def
test_check_grad
(
self
):
class
Test2DReduce1
(
Test1DReduce
):
self
.
check_grad
([
'X'
],
'Out'
)
def
setUp
(
self
):
self
.
op_type
=
"reduce_sum"
self
.
attrs
=
{
'dim'
:
[
1
]}
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
20
,
10
)).
astype
(
"float64"
)}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
1
)}
class
TestKeepDimReduce
(
Test1DReduce
):
def
setUp
(
self
):
self
.
op_type
=
"reduce_sum"
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
5
,
6
,
10
)).
astype
(
"float64"
)}
self
.
attrs
=
{
'dim'
:
[
-
2
],
'keep_dim'
:
True
}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
(
axis
=
tuple
(
self
.
attrs
[
'dim'
]),
keepdims
=
self
.
attrs
[
'keep_dim'
])
}
class
TestReduceAll
(
OpTest
):
class
TestReduceAll
(
Test1DReduce
):
def
setUp
(
self
):
def
setUp
(
self
):
self
.
op_type
=
"reduce_sum"
self
.
op_type
=
"reduce_sum"
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
5
,
6
,
2
,
10
)).
astype
(
"float64"
)}
self
.
inputs
=
{
'X'
:
np
.
random
.
random
((
5
,
6
,
2
,
10
)).
astype
(
"float64"
)}
self
.
attrs
=
{
'reduce_all'
:
True
}
self
.
attrs
=
{
'reduce_all'
:
True
}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
()}
self
.
outputs
=
{
'Out'
:
self
.
inputs
[
'X'
].
sum
()}
def
test_check_output
(
self
):
self
.
check_output
()
def
test_check_grad
(
self
):
self
.
check_grad
([
'X'
],
'Out'
)
## reduction in multi dims
## reduction in multi dims
class
TestReduceMeanOpMultiAxises
(
OpTest
):
class
TestReduceMeanOpMultiAxises
(
OpTest
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录