Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
a28a5564
P
Paddle
项目概览
PaddlePaddle
/
Paddle
1 年多 前同步成功
通知
2302
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a28a5564
编写于
8月 17, 2017
作者:
D
dangqingqing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add more comments and fix code style.
上级
9a0eedf5
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
51 addition
and
13 deletion
+51
-13
python/paddle/v2/framework/tests/gradient_checker.py
python/paddle/v2/framework/tests/gradient_checker.py
+51
-13
未找到文件。
python/paddle/v2/framework/tests/gradient_checker.py
浏览文件 @
a28a5564
...
@@ -110,7 +110,24 @@ def get_numeric_gradient(op,
...
@@ -110,7 +110,24 @@ def get_numeric_gradient(op,
class
GradientChecker
(
unittest
.
TestCase
):
class
GradientChecker
(
unittest
.
TestCase
):
def
get_grad
(
self
,
forward_op
,
backward_op
,
input_vars
,
grad_names
,
place
):
def
__get_gradient
(
self
,
forward_op
,
backward_op
,
input_value
,
grad_names
,
place
):
"""Get the input gradients after running forward and backward operators
on the given places.
:param forward_op: forward operator
:type forward_op: Operator
:param backward_op: backward operator
:type backward_op: Operator
:param input_value: input values.
:type input_value: dict{string:numpy.array}
:param grad_names: the names of returned input gradients.
:type input_value: a list of string
:param place: the device type.
:type place: CPUPlace or GPUPlace
:return: the input grdients of given grad_names.
:rtype: a list of numpy.array
"""
scope
=
core
.
Scope
()
scope
=
core
.
Scope
()
ctx
=
core
.
DeviceContext
.
create
(
place
)
ctx
=
core
.
DeviceContext
.
create
(
place
)
...
@@ -120,7 +137,7 @@ class GradientChecker(unittest.TestCase):
...
@@ -120,7 +137,7 @@ class GradientChecker(unittest.TestCase):
out_names
=
[
item
for
k
in
outputs
for
item
in
outputs
[
k
]]
out_names
=
[
item
for
k
in
outputs
for
item
in
outputs
[
k
]]
# create input var and set value
# create input var and set value
for
name
,
value
in
input_va
rs
.
iteritems
():
for
name
,
value
in
input_va
lue
.
iteritems
():
if
name
not
in
in_names
:
if
name
not
in
in_names
:
raise
ValueError
(
name
+
"does not exist in Op's inputs."
)
raise
ValueError
(
name
+
"does not exist in Op's inputs."
)
var
=
scope
.
new_var
(
name
).
get_tensor
()
var
=
scope
.
new_var
(
name
).
get_tensor
()
...
@@ -154,7 +171,16 @@ class GradientChecker(unittest.TestCase):
...
@@ -154,7 +171,16 @@ class GradientChecker(unittest.TestCase):
]
]
return
outs
return
outs
def
compare_grad
(
self
,
forward_op
,
inputs
):
def
compare_grad
(
self
,
forward_op
,
input_value
):
""" Compare the input gradients between CPU and GPU for the given forward
operator.
:param forward_op: forward operator
:type forward_op: Operator
:param input_value: input values.
:type input_value: dict{string:numpy.array}
:raises: AssertionError, there is different gradient value.
"""
backward_op
=
core
.
Operator
.
backward
(
forward_op
,
set
())
backward_op
=
core
.
Operator
.
backward
(
forward_op
,
set
())
# return if not compile with GPU or not implementing GPU kernel
# return if not compile with GPU or not implementing GPU kernel
if
not
(
core
.
is_compile_gpu
()
and
backward_op
.
support_gpu
()):
if
not
(
core
.
is_compile_gpu
()
and
backward_op
.
support_gpu
()):
...
@@ -162,19 +188,31 @@ class GradientChecker(unittest.TestCase):
...
@@ -162,19 +188,31 @@ class GradientChecker(unittest.TestCase):
outputs
=
backward_op
.
outputs
()
outputs
=
backward_op
.
outputs
()
out_names
=
[
item
for
k
in
outputs
for
item
in
outputs
[
k
]]
out_names
=
[
item
for
k
in
outputs
for
item
in
outputs
[
k
]]
cpu_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input
s
,
out_names
,
cpu_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input
_value
,
core
.
CPUPlace
())
out_names
,
core
.
CPUPlace
())
gpu_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input
s
,
out_names
,
gpu_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input
_value
,
core
.
GPUPlace
(
0
))
out_names
,
core
.
GPUPlace
(
0
))
for
c_grad
,
g_grad
,
name
in
itertools
.
izip
(
cpu_grads
,
gpu_grads
,
for
c_grad
,
g_grad
,
name
in
itertools
.
izip
(
cpu_grads
,
gpu_grads
,
out_names
):
out_names
):
self
.
assertTrue
(
self
.
assertTrue
(
numpy
.
allclose
(
c_grad
,
g_grad
),
numpy
.
allclose
(
c_grad
,
g_grad
,
atol
=
1e-4
),
"output name: "
+
name
+
" has diff"
)
"output name: "
+
name
+
" has diff"
)
def
assert_is_close
(
self
,
numeric_grads
,
analytic_grads
,
names
,
def
__
assert_is_close
(
self
,
numeric_grads
,
analytic_grads
,
names
,
max_relative_error
,
msg_prefix
):
max_relative_error
,
msg_prefix
):
"""Use relative error for the comparison.
:param numeric_grads: the numerical graidents.
:type numeric_grads: a list of numpy.array
:param analytic_grads: the analytical graidents.
:type analytic_grads: a list of numpy.array
:param name: the names of gradients, used to print for debug.
:type names: a list of string
:param msg_prefix: string info, used to print for debug.
:type msf_prefix: string
"""
for
a
,
b
,
name
in
itertools
.
izip
(
numeric_grads
,
analytic_grads
,
names
):
for
a
,
b
,
name
in
itertools
.
izip
(
numeric_grads
,
analytic_grads
,
names
):
abs_a
=
numpy
.
abs
(
a
)
abs_a
=
numpy
.
abs
(
a
)
# if abs_a is nearly zero, then use abs error for a, not relative
# if abs_a is nearly zero, then use abs error for a, not relative
...
@@ -241,6 +279,6 @@ class GradientChecker(unittest.TestCase):
...
@@ -241,6 +279,6 @@ class GradientChecker(unittest.TestCase):
# get analytical gradients according to different device
# get analytical gradients according to different device
analytic_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input_vars
,
analytic_grads
=
self
.
get_grad
(
forward_op
,
backward_op
,
input_vars
,
check_names
,
place
)
check_names
,
place
)
self
.
assert_is_close
(
numeric_grads
,
analytic_grads
,
check_names
,
self
.
__
assert_is_close
(
numeric_grads
,
analytic_grads
,
check_names
,
max_relative_error
,
max_relative_error
,
"Gradient Check On %s"
%
str
(
place
))
"Gradient Check On %s"
%
str
(
place
))
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录