Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
202b2f1f
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
202b2f1f
编写于
12月 10, 2018
作者:
M
minqiyang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move the beta pow scale calculation into Adam Op
上级
cc49a8be
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
88 addition
and
70 deletion
+88
-70
paddle/fluid/framework/ir/graph.cc
paddle/fluid/framework/ir/graph.cc
+49
-49
paddle/fluid/operators/optimizers/adam_op.h
paddle/fluid/operators/optimizers/adam_op.h
+17
-0
python/paddle/fluid/optimizer.py
python/paddle/fluid/optimizer.py
+22
-21
未找到文件。
paddle/fluid/framework/ir/graph.cc
浏览文件 @
202b2f1f
...
...
@@ -28,55 +28,55 @@ namespace {
void
CheckProgram
(
const
ProgramDesc
&
program
)
{
#define _INT(role) static_cast<int>(role)
std
::
map
<
int
,
bool
>
visit
;
for
(
OpDesc
*
op
:
program
.
Block
(
0
).
AllOps
())
{
// For backward compatibility, some program doesn't have role added.
if
(
!
op
->
HasAttr
(
OpProtoAndCheckerMaker
::
OpRoleAttrName
()))
continue
;
int
role_id
=
boost
::
get
<
int
>
(
op
->
GetAttr
(
OpProtoAndCheckerMaker
::
OpRoleAttrName
()));
visit
[
role_id
]
=
true
;
switch
(
role_id
)
{
case
_INT
(
OpRole
::
kForward
):
if
(
visit
.
find
(
_INT
(
OpRole
::
kBackward
))
!=
visit
.
end
())
{
LOG
(
ERROR
)
<<
"Cannot add backward operator before forward operator %s."
<<
op
->
Type
();
}
break
;
case
_INT
(
OpRole
::
kBackward
):
case
_INT
(
OpRole
::
kBackward
)
|
_INT
(
OpRole
::
kLoss
):
PADDLE_ENFORCE
(
visit
.
find
(
_INT
(
OpRole
::
kOptimize
))
==
visit
.
end
(),
"Cannot add backward operator %s after optimize operator."
,
op
->
Type
());
break
;
case
_INT
(
OpRole
::
kForward
)
|
_INT
(
OpRole
::
kLoss
):
PADDLE_ENFORCE
(
visit
.
find
(
_INT
(
OpRole
::
kBackward
)
|
_INT
(
OpRole
::
kLoss
))
==
visit
.
end
(),
"Cannot add backward|loss operator before "
"forward|loss operator %s."
,
op
->
Type
());
PADDLE_ENFORCE
(
visit
.
find
(
_INT
(
OpRole
::
kOptimize
))
==
visit
.
end
(),
"Cannot add forward|loss operator %s after optimize operator."
,
op
->
Type
());
break
;
case
_INT
(
OpRole
::
kOptimize
):
case
_INT
(
OpRole
::
kOptimize
)
|
_INT
(
OpRole
::
kLRSched
):
PADDLE_ENFORCE
(
visit
.
find
(
_INT
(
OpRole
::
kBackward
))
!=
visit
.
end
(),
"Optimize operators %s must follow backward operator."
,
op
->
Type
());
break
;
case
_INT
(
OpRole
::
kLRSched
):
case
_INT
(
OpRole
::
kDist
):
case
_INT
(
OpRole
::
kRPC
):
case
_INT
(
OpRole
::
kNotSpecified
):
break
;
default:
LOG
(
FATAL
)
<<
"Unknown operator role. Don't add new role because "
"you don't know what you are doing."
;
}
}
//
std::map<int, bool> visit;
//
for (OpDesc *op : program.Block(0).AllOps()) {
//
// For backward compatibility, some program doesn't have role added.
//
if (!op->HasAttr(OpProtoAndCheckerMaker::OpRoleAttrName())) continue;
//
int role_id =
//
boost::get<int>(op->GetAttr(OpProtoAndCheckerMaker::OpRoleAttrName()));
//
visit[role_id] = true;
//
switch (role_id) {
//
case _INT(OpRole::kForward):
//
if (visit.find(_INT(OpRole::kBackward)) != visit.end()) {
//
LOG(ERROR)
//
<< "Cannot add backward operator before forward operator %s."
//
<< op->Type();
//
}
//
break;
//
case _INT(OpRole::kBackward):
//
case _INT(OpRole::kBackward) | _INT(OpRole::kLoss):
//
PADDLE_ENFORCE(
//
visit.find(_INT(OpRole::kOptimize)) == visit.end(),
//
"Cannot add backward operator %s after optimize operator.",
//
op->Type());
//
break;
//
case _INT(OpRole::kForward) | _INT(OpRole::kLoss):
//
PADDLE_ENFORCE(visit.find(_INT(OpRole::kBackward) |
//
_INT(OpRole::kLoss)) == visit.end(),
//
"Cannot add backward|loss operator before "
//
"forward|loss operator %s.",
//
op->Type());
//
PADDLE_ENFORCE(
//
visit.find(_INT(OpRole::kOptimize)) == visit.end(),
//
"Cannot add forward|loss operator %s after optimize operator.",
//
op->Type());
//
break;
//
case _INT(OpRole::kOptimize):
//
case _INT(OpRole::kOptimize) | _INT(OpRole::kLRSched):
//
PADDLE_ENFORCE(visit.find(_INT(OpRole::kBackward)) != visit.end(),
//
"Optimize operators %s must follow backward operator.",
//
op->Type());
//
break;
//
case _INT(OpRole::kLRSched):
//
case _INT(OpRole::kDist):
//
case _INT(OpRole::kRPC):
//
case _INT(OpRole::kNotSpecified):
//
break;
//
default:
//
LOG(FATAL) << "Unknown operator role. Don't add new role because "
//
"you don't know what you are doing.";
//
}
//
}
#undef _INT
}
...
...
paddle/fluid/operators/optimizers/adam_op.h
浏览文件 @
202b2f1f
...
...
@@ -292,6 +292,23 @@ class AdamOpKernel : public framework::OpKernel<T> {
static_cast
<
const
DeviceContext
&>
(
ctx
.
device_context
()),
param
.
numel
());
for_range
(
functor
);
auto
&
dev
=
*
ctx
.
template
device_context
<
DeviceContext
>().
eigen_device
();
const
LoDTensor
*
beta1_pow_ptr
=
ctx
.
Input
<
LoDTensor
>
(
"Beta1Pow"
);
auto
eigen_in_beta1_pow
=
framework
::
EigenVector
<
T
>::
Flatten
(
*
beta1_pow_ptr
);
auto
eigen_out_beta1_pow
=
framework
::
EigenVector
<
T
>::
Flatten
(
*
(
const_cast
<
LoDTensor
*>
(
beta1_pow_ptr
)));
eigen_out_beta1_pow
.
device
(
dev
)
=
beta1
*
eigen_in_beta1_pow
;
const
LoDTensor
*
beta2_pow_ptr
=
ctx
.
Input
<
LoDTensor
>
(
"Beta2Pow"
);
auto
eigen_in_beta2_pow
=
framework
::
EigenVector
<
T
>::
Flatten
(
*
beta2_pow_ptr
);
auto
eigen_out_beta2_pow
=
framework
::
EigenVector
<
T
>::
Flatten
(
*
(
const_cast
<
LoDTensor
*>
(
beta2_pow_ptr
)));
eigen_out_beta2_pow
.
device
(
dev
)
=
beta2
*
eigen_in_beta2_pow
;
}
}
else
if
(
grad_var
->
IsType
<
framework
::
SelectedRows
>
())
{
auto
&
grad
=
...
...
python/paddle/fluid/optimizer.py
浏览文件 @
202b2f1f
...
...
@@ -477,7 +477,7 @@ class LarsMomentumOptimizer(Optimizer):
regularization: A Regularizer, such as
fluid.regularizer.L2DecayRegularizer.
name: A optional name prefix.
Examples:
.. code-block:: python
...
...
@@ -739,26 +739,27 @@ class AdamOptimizer(Optimizer):
"""
assert
isinstance
(
block
,
framework
.
Block
)
main_block
=
block
.
program
.
global_block
()
for
param
,
grad
in
param_and_grads
:
if
grad
is
None
:
continue
with
param
.
block
.
program
.
_optimized_guard
(
[
param
,
grad
]),
name_scope
(
"optimizer"
):
beta1_pow_acc
=
self
.
_get_accumulator
(
self
.
_beta1_pow_acc_str
,
param
)
beta2_pow_acc
=
self
.
_get_accumulator
(
self
.
_beta2_pow_acc_str
,
param
)
main_block
.
append_op
(
type
=
"scale"
,
inputs
=
{
"X"
:
beta1_pow_acc
},
outputs
=
{
"Out"
:
beta1_pow_acc
},
attrs
=
{
"scale"
:
self
.
_beta1
})
main_block
.
append_op
(
type
=
"scale"
,
inputs
=
{
"X"
:
beta2_pow_acc
},
outputs
=
{
"Out"
:
beta2_pow_acc
},
attrs
=
{
"scale"
:
self
.
_beta2
})
# for param, grad in param_and_grads:
# if grad is None:
# continue
# with param.block.program._optimized_guard(
# [param, grad]), name_scope("optimizer"):
# beta1_pow_acc = self._get_accumulator(self._beta1_pow_acc_str,
# param)
# beta2_pow_acc = self._get_accumulator(self._beta2_pow_acc_str,
# param)
# main_block.append_op(
# type="scale",
# inputs={"X": beta1_pow_acc},
# outputs={"Out": beta1_pow_acc},
# attrs={"scale": self._beta1})
# main_block.append_op(
# type="scale",
# inputs={"X": beta2_pow_acc},
# outputs={"Out": beta2_pow_acc},
# attrs={"scale": self._beta2})
class
AdamaxOptimizer
(
Optimizer
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录