Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
e2d102aa
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e2d102aa
编写于
12月 04, 2018
作者:
C
chengduozh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
doc refine
上级
e26afed5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
2 addition
and
5 deletion
+2
-5
doc/fluid/dev/op_notes.md
doc/fluid/dev/op_notes.md
+2
-5
未找到文件。
doc/fluid/dev/op_notes.md
浏览文件 @
e2d102aa
...
@@ -49,7 +49,7 @@ Operator继承关系图:
...
@@ -49,7 +49,7 @@ Operator继承关系图:
<tr>
<tr>
<td>
GradOpMakerFN
</td>
<td>
GradOpMakerFN
</td>
<td>
Functor
</td>
<td>
Functor
</td>
<td>
返回当前Op对应的反向Op
:std::vector
<
std::unique_ptr
<
OpDesc
>
>
,因为正向Op的反向可能有多个Op构成
</td>
<td>
返回当前Op对应的反向Op
的一组OpDesc
,因为正向Op的反向可能有多个Op构成
</td>
<td>
编译时调用
</td>
<td>
编译时调用
</td>
</tr>
</tr>
<tr>
<tr>
...
@@ -92,15 +92,12 @@ Operator继承关系图:
...
@@ -92,15 +92,12 @@ Operator继承关系图:
**注意:**
**注意:**
1.
对于所有Op,前三个参数是必须的,op_type指明op的名字,OperatorBase是该Op的对象,op_maker_and_checker_maker是op的maker和op中attr的checker。
1.
对于所有Op,前三个参数是必须的,op_type指明op的名字,OperatorBase是该Op的对象,op_maker_and_checker_maker是op的maker和op中attr的checker。
2.
如果该Op有反向,则必须要有op_grad_opmaker,因为在backward会根据正向的Op中获取反向Op的Maker。
2.
如果该Op有反向,则必须要有op_grad_opmaker,因为在backward会根据正向的Op中获取反向Op的Maker。
3.
框架提供了一个默认的op_grad_opmaker:
`DefaultGradOpDescMaker`
,这个Maker会将前向Op的输入和输出都作为反向Op的输入,将前向Op的输入的梯度作为反向Op的输出,并将前向Op的属性拷贝过来。
**注意:**
DefaultGradOpDescMaker会将前向Op的所有输入输出都做反向Op的输入,即使这个输入是没有必要的,这将会导致无法对没有用到的变量做内存优化。
3.
框架提供了一个默认的op_grad_opmaker:
`DefaultGradOpDescMaker`
,这个Maker会将前向Op的输入和输出都作为反向Op的输入,将前向Op的输入的梯度作为反向Op的输出,并将前向Op的属性拷贝过来。
**注意:**
DefaultGradOpDescMaker会将前向Op的所有输入输出都做反向Op的输入,即使这个输入是没有必要的,这将会导致无法对没有用到的变量做内存优化。
4.
框架没有提供默认的op_infer_var_shape方法。如果该Op是无OpKernel的,通常需要用户添加对应的op_infer_var_shape方法;如果该Op是有OpKernel的,需要实现
`OperatorWithKernel`
中的
`InferShape`
方法,此时不需要提供op_infer_var_shape方法。具体实现可参考
[
while_op.cc
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/controlflow/while_op.cc
)
,
[
conv_op.cc
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/conv_op.cc
)
。
4.
框架没有提供默认的op_infer_var_shape方法。如果该Op是无OpKernel的,通常需要用户添加对应的op_infer_var_shape方法;如果该Op是有OpKernel的,需要实现
`OperatorWithKernel`
中的
`InferShape`
方法,此时不需要提供op_infer_var_shape方法。具体实现可参考
[
while_op.cc
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/controlflow/while_op.cc
)
,
[
conv_op.cc
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/conv_op.cc
)
。
5.
框架没有提供默认的op_infer_var_type方法,用户需要根据实际情况添加op_infer_var_shape。严格来说每个Op都应该注册一个InferVarType,op_infer_var_type根据输入的Var的type和dtype推断输出Var的type和dtype。
**注意:**
在Python端的LayerHelper中create_variable_for_type_inference操作返回的Variable里面是LoDTensor,C++端的InferVarType可以修改
`Variable`
的type和dtype。
5.
框架没有提供默认的op_infer_var_type方法,用户需要根据实际情况添加op_infer_var_shape。严格来说每个Op都应该注册一个InferVarType,op_infer_var_type根据输入的Var的type和dtype推断输出Var的type和dtype。
**注意:**
在Python端的LayerHelper中create_variable_for_type_inference操作返回的Variable里面是LoDTensor,C++端的InferVarType可以修改
`Variable`
的type和dtype。
更多内容请参考:
更多内容请参考:
-
[
如何写新的Op
](
http://paddlepaddle.org/documentation/docs/zh/1.1/advanced_usage/development/new_op.html
)
-
[
如何写新的Op
](
http://paddlepaddle.org/documentation/docs/zh/1.1/advanced_usage/development/new_op.html
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录